迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10967 | Accepted: 6547 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
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)
水水的bfs,重点在于路径记录.
标记上一个节点,找到解的时候递归调用输出路径.
/************************************************************************* > File Name: code/2015summer/searching/KK.cpp > Author: 111qqz > Email: rkz2013@126.com > Created Time: 2015年07月25日 星期六 13时33分00秒 ************************************************************************/ #include<iostream> #include<iomanip> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<map> #include<set> #include<queue> #include<vector> #include<stack> #define y0 abc111qqz #define y1 hust111qqz #define yn hez111qqz #define j1 cute111qqz #define tm crazy111qqz #define lr dying111qqz using namespace std; #define REP(i, n) for (int i=0;i<int(n);++i) typedef long long LL; typedef unsigned long long ULL; int a[10][10]; int head = 0; int tail = 1; int dirx[2]={1,0}; int diry[2]={0,1}; struct node { int x,y,pre; }q[10]; void print(int x) { if (q[x].pre!=-1) { print(q[x].pre); printf("(%d, %d) ",q[x].x,q[x].y); } } void bfs() { q[head].x=0; q[head].y=0; q[head].pre=-1; while (head<tail) { if (q[head].x==4&&q[head].y==4) { print(head); return; } for (int i = 0 ; i < 2 ; i++ ) { int newx=dirx[i]+q[head].x; int newy=diry[i]+q[head].y; if (newx>=0&&newx<5&&newy>=0&&newy<5&&a[newx][newy]==0) { q[tail].x=newx; q[tail].y=newy; q[tail].pre=head; tail++; } } head++; } } int main() { for ( int i = 0 ; i < 5 ; i++ ) { for ( int j = 0 ; j < 5; j++) { cin>>a[i][j]; } } printf("(0, 0) "); bfs(); return 0; }