定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
Input
一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
输入例子:
5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
输出例子:
(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4)(4,4)
阿阳解题思路:#include <iostream> #include <vector> #include <queue> using namespace std; struct A{ int x; int y; }; A W[4]={{-1,0},{1,0},{0,-1},{0,1}}; bool is(vector<vector<int> > vec, struct A a,struct A b,int M, int N, int num){ if(a.x+b.x>=0&&a.x+b.x<M&&a.y+b.y>=0&&a.y+b.y<N&&vec[a.x+b.x][a.y+b.y]==num) return true; else return false; } int main(){ int M,N; while(cin>>M>>N){ vector<vector<int> > vec(M,vector<int>(N)); for(int i=0;i<M;i++) for(int j=0;j<N;j++) cin>>vec[i][j]; queue<A> Q; A a={0,0}; vec[0][0]=2; Q.push(a); while(!Q.empty()){ a=Q.front(); Q.pop(); int flag=0; for(int i=0;i<4;i++) if(is(vec,a,W[i],M,N,0)){ vec[a.x+W[i].x][a.y+W[i].y]=vec[a.x][a.y]+1; if(a.x+W[i].x==M&&a.y+W[i].y==N){ flag=1; break; } A temp={a.x+W[i].x,a.y+W[i].y}; Q.push(temp); } if(flag) break; } a.x=M-1;a.y=N-1; vector<A> v; v.push_back(a); while(!(a.x==0&&a.y==0)){ for(int i=0;i<4;i++) if(is(vec,a,W[i],M,N,vec[a.x][a.y]-1)){ a.x=a.x+W[i].x; a.y=a.y+W[i].y; v.push_back(a); break; } } for(int i=v.size()-1;i>=0;i--) cout<<"("<<v[i].x<<","<<v[i].y<<")"<<endl; } return 0; }
#include <iostream> #include <cstdio> #include <vector> #include <queue> using namespace std; struct PP //位置结构体 { int x; int y; }te, nt; int grid[100][100]; int isPath(int m,int n) //int isPath(int **grid, int m, int n) { int dirx[] = { 1,0,-1,0 };//方向 移动标志 int diry[] = { 0,1,0,-1 }; int i; te.x = 0; te.y = 0;//左上角的0,0位置开始 if (grid[0][0] == 0) return 0; //全局数组 访问标志 vis queue<PP> q; q.push(te); vector<vector<int > >vis; vector<int> temp; for (i = 0; i < n; i++) { temp.push_back(0); } for (i = 0; i< m; i++) { vis.push_back(temp); } vis[te.x][te.y] = 1; while (q.size() >= 1) { te = q.front();//取点 if (grid[te.x][te.y] == 9) return 1; q.pop(); for (i = 0; i < 4; i++) { nt.x = te.x + dirx[i]; nt.y = te.y + diry[i]; if (nt.x < 0 || nt.x >= m || nt.y < 0 || nt.y >= n || grid[nt.x][nt.y] == 0 || vis[nt.x][nt.y] == 1) { continue; } else { q.push(nt); vis[nt.x][nt.y] = 1; } } } return 0; } int main() { //freopen("in.txt", "r", stdin); int m, n, re; char *a = ""; int *b = NULL; int i, j; //while (scanf("%d%d", &m, &n) != EOF) cin >> m >> n; { printf("%d\n", m); for (i = 0; i<m; i++) { for (j = 0; j<n; j++) { //scanf("%d", &grid[i][j]); cin >> grid[i][j]; } } re = isPath(m, n); printf("%d\n", re); } cout << "Hello world!" << endl; return 0; }