// wyscig gorski // 1 przejscie z gory, 2 przejscie z prawej, 3 przejscie z dolu, 4 przejscie z lewej #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int rozmiar_mapy = 2005; int labirynt[rozmiar_mapy][rozmiar_mapy]; int now_nodes[rozmiar_mapy*5], new_nodes[rozmiar_mapy*5]; int best_path_downs = 0; int player_up, player_down; long long best_time; int winners; char visual_set[] = "0123456789"; int lines, length, players_set; string map_line; void update_node_set(){ for(int i=0; i<rozmiar_mapy*2; i++){ now_nodes[i] = new_nodes[i]; new_nodes[i] = 0; } return; } void call_nodes(){ int x, y; int new_node_pointer = 0; for(int i=0; now_nodes[i]!=0; i++){ x = now_nodes[i]%rozmiar_mapy; y = now_nodes[i]/rozmiar_mapy; if(labirynt[x-1][y]==0){ labirynt[x-1][y] = 3, new_nodes[new_node_pointer] = y * rozmiar_mapy + x-1; new_node_pointer++; }//po lewej if(labirynt[x+1][y]==0){ labirynt[x+1][y] = 1, new_nodes[new_node_pointer] = y * rozmiar_mapy + x+1; new_node_pointer++; } //po prawej if(labirynt[x][y-1]==0){ labirynt[x][y-1] = 2, new_nodes[new_node_pointer] = (y-1) * rozmiar_mapy + x; new_node_pointer++; } //od gory if(labirynt[x][y+1]==0){ labirynt[x][y+1] = 4, new_nodes[new_node_pointer] = (y+1) * rozmiar_mapy + x; new_node_pointer++; } //od dolu } return; } int parent(int x, int y){ if(labirynt[y][x]==5) return 0; if(labirynt[y][x]==1) return 0+parent(x, y-1); if(labirynt[y][x]==2) return 1+parent(x+1, y); if(labirynt[y][x]==3) return 1+parent(x, y+1); if(labirynt[y][x]==4) return 0+parent(x-1, y); return 0; } int main(){ cin>>lines>>length>>players_set; for(int x=0; x<=length+1; x++){ labirynt[0][x]=9; labirynt[lines+1][x]=9; } for(int x=1; x<=lines; x++){ cin>>map_line; labirynt[x][0]=9, labirynt[x][length+1]=9; for(int y=1; y<=length; y++){ if(map_line[y-1]=='X'){ labirynt[x][y]=9; } else labirynt[x][y]=0; } } labirynt[1][1]=5; now_nodes[0] = rozmiar_mapy + 1; while(labirynt[lines][length]==0){ call_nodes(); update_node_set(); } best_path_downs = parent(length, lines); cin>>player_up>>player_down; best_time = player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs; winners++; for(int i=1; i<players_set; i++){ cin>>player_up>>player_down; if(player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs < best_time){ best_time = player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs; winners = 0; } if(player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs == best_time){ winners++; } } cout<<best_time<<" "<<winners; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | // wyscig gorski // 1 przejscie z gory, 2 przejscie z prawej, 3 przejscie z dolu, 4 przejscie z lewej #include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; const int rozmiar_mapy = 2005; int labirynt[rozmiar_mapy][rozmiar_mapy]; int now_nodes[rozmiar_mapy*5], new_nodes[rozmiar_mapy*5]; int best_path_downs = 0; int player_up, player_down; long long best_time; int winners; char visual_set[] = "0123456789"; int lines, length, players_set; string map_line; void update_node_set(){ for(int i=0; i<rozmiar_mapy*2; i++){ now_nodes[i] = new_nodes[i]; new_nodes[i] = 0; } return; } void call_nodes(){ int x, y; int new_node_pointer = 0; for(int i=0; now_nodes[i]!=0; i++){ x = now_nodes[i]%rozmiar_mapy; y = now_nodes[i]/rozmiar_mapy; if(labirynt[x-1][y]==0){ labirynt[x-1][y] = 3, new_nodes[new_node_pointer] = y * rozmiar_mapy + x-1; new_node_pointer++; }//po lewej if(labirynt[x+1][y]==0){ labirynt[x+1][y] = 1, new_nodes[new_node_pointer] = y * rozmiar_mapy + x+1; new_node_pointer++; } //po prawej if(labirynt[x][y-1]==0){ labirynt[x][y-1] = 2, new_nodes[new_node_pointer] = (y-1) * rozmiar_mapy + x; new_node_pointer++; } //od gory if(labirynt[x][y+1]==0){ labirynt[x][y+1] = 4, new_nodes[new_node_pointer] = (y+1) * rozmiar_mapy + x; new_node_pointer++; } //od dolu } return; } int parent(int x, int y){ if(labirynt[y][x]==5) return 0; if(labirynt[y][x]==1) return 0+parent(x, y-1); if(labirynt[y][x]==2) return 1+parent(x+1, y); if(labirynt[y][x]==3) return 1+parent(x, y+1); if(labirynt[y][x]==4) return 0+parent(x-1, y); return 0; } int main(){ cin>>lines>>length>>players_set; for(int x=0; x<=length+1; x++){ labirynt[0][x]=9; labirynt[lines+1][x]=9; } for(int x=1; x<=lines; x++){ cin>>map_line; labirynt[x][0]=9, labirynt[x][length+1]=9; for(int y=1; y<=length; y++){ if(map_line[y-1]=='X'){ labirynt[x][y]=9; } else labirynt[x][y]=0; } } labirynt[1][1]=5; now_nodes[0] = rozmiar_mapy + 1; while(labirynt[lines][length]==0){ call_nodes(); update_node_set(); } best_path_downs = parent(length, lines); cin>>player_up>>player_down; best_time = player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs; winners++; for(int i=1; i<players_set; i++){ cin>>player_up>>player_down; if(player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs < best_time){ best_time = player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs; winners = 0; } if(player_up*(length-1 + lines-1 + best_path_downs) + player_down * best_path_downs == best_time){ winners++; } } cout<<best_time<<" "<<winners; return 0; } |