标题: | 迷宫问题 |
时 限: | 100000 ms |
内存限制: | 100000 K |
总时限: | 10000 ms |
描述: |
迷宫问题 迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径. |
输入: |
迷宫宽度w 迷宫高度h 迷宫第一行 迷宫第二行 ... 迷宫第h 行 |
输出: |
入口横坐标1 入口纵坐标1 横坐标2 纵坐标2 横坐标3 纵坐标3 横坐标4 纵坐标4 ... 横坐标n-1 纵坐标n-1 出口横坐标n 出口纵坐标n |
输入样例: |
8 10 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 3 1 0 1 1 1 0 0 1 0 0 4 1 1 0 0 0 0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 |
输出样例: |
3 3 2 3 2 4 2 5 3 5 3 6 3 7 4 7 4 6 4 5 4 4 5 4 6 4 |
提示: |
使用栈 参见教材 50 页 |
1 //2016.10.24 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 6 using namespace std; 7 8 const int N = 1005; 9 int maze[N][N], book[N][N], top, n, m; 10 int dx[4] = {1, 0, -1, 0}; 11 int dy[4] = {0, -1, 0, 1}; 12 struct point 13 { 14 int x, y; 15 }s[N<<4]; 16 17 void dfs() 18 { 19 bool fg; 20 while(1) 21 { 22 fg = false; 23 for(int i = 0; i < 4; i++) 24 { 25 int nx = s[top].x + dx[i]; 26 int ny = s[top].y + dy[i]; 27 if(nx < 0 || nx >= n ||ny < 0 || ny >= m)continue; 28 if(maze[nx][ny] == 4) 29 { 30 for(int i = 0; i <= top; i++) 31 printf("%d %d\n", s[i].y, s[i].x); 32 printf("%d %d\n", ny, nx); 33 return ; 34 } 35 if(maze[nx][ny]==0&&book[nx][ny]==0){ 36 top++; 37 fg = true; 38 s[top].x = nx; 39 s[top].y = ny; 40 book[nx][ny] = 1; 41 break; 42 } 43 } 44 if(!fg)top--; 45 } 46 } 47 48 int main() 49 { 50 int bx, by, ex, ey; 51 scanf("%d%d", &m, &n); 52 for(int i = 0; i < n; i++){ 53 for(int j = 0; j < m; j++){ 54 scanf("%d", &maze[i][j]); 55 if(maze[i][j] == 3){ 56 bx = i; by = j; 57 } 58 if(maze[i][j] == 4){ 59 ex = i; ey = j; 60 } 61 } 62 } 63 memset(book, 0, sizeof(book)); 64 top = 0; 65 s[top].x = bx, s[top].y = by; 66 dfs(); 67 68 return 0; 69 }
时间: 2024-11-05 04:49:09