1.http://acm.hdu.edu.cn/showproblem.php?pid=1312
题意:在一个仅有红黑格子组成的矩形中,一个人只能走上下左右相邻黑色格子,问从起点开始共能走多少个格子?
’#‘:红色格子
’.': 黑色格子;
’@‘:起点
BFS 和 DFS 都可以遍历所有走的点,每次走过一点时,计数++即可;
2.http://acm.hdu.edu.cn/showproblem.php?pid=1728
由题可知,在限制转弯数量的前提下 能够从一点走到另一个点即可;BFS 和 DFS都能求出解。我 DFS 还没实现
需要注意:1.点坐标是从 1 开始的。
2.最短的路径可能不满足转弯数的限制。
3.起点与终点重合。
超内存代码:已找到原因,完全是大意所致。贴在此处,希望自己以后再看时能一眼找到。
1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 #define N 105 6 7 struct Pos 8 { 9 int x, y; 10 int turn; 11 int dire; 12 }S, E; 13 char map[N][N]; 14 bool used[N][N][12][4]; 15 int dir[][2]={1,0, -1,0, 0,1, 0,-1}; 16 int n, m, k; 17 18 bool Judge (Pos s) 19 { 20 if (s.x>=1 && s.x<=m && s.y>=1 && s.y<=n && map[s.x][s.y]=='.' && !used[s.x][s.y][S.turn][S.dire] && s.turn <= k) 21 return true; 22 return false; 23 } 24 25 bool bfs () 26 { 27 Pos Pre, Cur; 28 queue <Pos> Q; 29 while (!Q.empty ()) Q.pop(); 30 memset (used, 0, sizeof used); 31 32 S.dire = -1; 33 S.turn = 0; 34 used[S.x][S.y][S.turn][S.dire] = true; 35 Q.push (S); 36 while (!Q.empty ()) 37 { 38 Pre = Q.front (); 39 Cur = Pre; 40 Q.pop(); 41 if (Cur.x==E.x && Cur.y==E.y) 42 return true; 43 for(int i=0; i<4; i++) 44 { 45 Cur.x = Pre.x + dir[i][0]; 46 Cur.y = Pre.y + dir[i][1]; 47 Cur.turn = Pre.turn; 48 Cur.dire = i; 49 if (Cur.dire != Pre.dire && Pre.dire !=-1) 50 Cur.turn++; 51 if (Judge (Cur)) 52 { 53 used[Cur.x][Cur.y][Cur.turn][Cur.dire] = true; 54 Q.push (Cur); 55 } 56 } 57 } 58 return false; 59 } 60 61 int main () 62 { 63 int t; 64 // freopen ("test.txt","r",stdin); 65 scanf ("%d",&t); 66 while (t--) 67 { 68 scanf ("%d%d",&m, &n); 69 for (int i=1; i<=m; i++) 70 for (int j=1; j<=n; j++) 71 scanf (" %c", map[i]+j); 72 scanf ("%d%d%d%d%d",&k, &S.y, &S.x, &E.y, &E.x); 73 74 puts ((bfs ()?"yes":"no")); 75 } 76 return 0; 77 }