http://acm.hdu.edu.cn/showproblem.php?pid=1728
题意:
一个迷宫...从起点走到终点,拐弯次数有限制的情况下找到最优的解。
坑爹:
本来用结构体来记录坐标、走的步数和拐弯次数,但是发现如果搜一条路径发现行不通的话这条路上所有点都被标记了,当我再次经过这里面的某个点
的时候就不能通过了。比如说我一开始行不通的那条路通过某个点是左右通过的,但我下次再要从上或者从下经过这个点的时候就会过不了。
解法:
每次向一个方向拓展时将这一个方向所有满足条件的点全部进队,这样就解决了某个点不会因为之前被标记过而导致下一次以另外一个方向进入这个店
的时候就不给经过的问题。
View Code
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 int n ; 6 int m; 7 char str[105][105]; 8 bool map[105][105]; 9 10 int po[4][2] = {1,0 , 0 ,1 , -1 ,0, 0 ,-1 }; 11 12 struct Node 13 { 14 int i,j; 15 int sum ; 16 }node[1000005]; 17 18 int main () 19 { 20 int N; 21 cin>>N; 22 while (N -- ) 23 { 24 memset(map,0,sizeof (map)); 25 26 cin>>n>>m; 27 int k; 28 int x1; 29 int x2; 30 int y1; 31 int y2; 32 33 for (int i = 0; i < n; i++) 34 { 35 cin>>str[i]; 36 } 37 scanf ("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2); 38 x1 -- ; 39 x2 -- ; 40 y1 -- ; 41 y2 -- ; 42 43 if (str[y1][x1] == '*' || str[y2][x2] == '*') 44 { 45 cout<<"no"<<endl; 46 continue; 47 } 48 49 if (x1 == x2 && y1 == y2 ) 50 { 51 cout<<"yes"<<endl; 52 continue ; 53 } 54 55 queue <int > Q; 56 int t = 0; 57 node[t].i = y1; 58 node[t].j = x1; 59 node[t].sum = 0; 60 61 map[y1][x1] = 1; 62 63 Q.push(t); 64 65 int stai; 66 int staj; 67 int edi; 68 int edj; 69 int flag = 0; 70 71 while (!Q.empty ()) 72 { 73 int temp = Q.front (); 74 Q.pop(); 75 76 77 stai = node[temp].i; 78 staj = node[temp].j; 79 if ( stai == y2 && staj == x2 && node[temp].sum <= k + 1) 80 { 81 flag = 1; 82 break; 83 } 84 if (node[temp].sum > k + 1) 85 { 86 break; 87 } 88 89 for (int i=0; i<4; i++) 90 { 91 edi = stai + po[i][0]; 92 edj = staj + po[i][1]; 93 while (edi >= 0 && edi <n && edj >= 0 && edj < m && str[edi][edj] == '.' ) 94 { 95 if (map[edi][edj]) 96 { 97 edi = edi + po[i][0]; 98 edj = edj + po[i][1]; 99 continue; 100 } 101 102 t ++ ; 103 node[t] .i = edi; 104 node[t]. j = edj; 105 node[t].sum = node[temp].sum + 1; 106 map[edi][edj] = 1; 107 Q.push(t); 108 109 edi = edi + po[i][0]; 110 edj = edj + po[i][1]; 111 } 112 } 113 } 114 if (flag ) 115 { 116 cout<<"yes"<<endl; 117 } 118 else 119 { 120 cout<<"no"<<endl; 121 } 122 123 } 124 return 0; 125 }