1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 int step,t; 6 int visit[25]; 7 int map[25]; 8 int pre[26]; 9 int disx[4]={0,1,0,-1}; 10 int disy[4]={1,0,-1,0}; 11 void initial(){ 12 memset(visit,0,sizeof(visit)); 13 for(int i=0;i<25;i++)pre[i]=-1; 14 } 15 void print(int num){ 16 if(num>0){ 17 int x=num/5,y=num%5; 18 print(pre[num]); //递归;让从第一个点开始 19 printf("(%d, %d) ",x,y); 20 } 21 } 22 void bfs(){int nx,ny,a,b; 23 queue<int>dl; 24 a=0; 25 dl.push(a); 26 visit[0]=1;memset(pre,-1,sizeof(pre)); 27 pre[0]=-1; 28 while(!dl.empty()){ 29 a=dl.front(); 30 dl.pop(); 31 for(int i=0;i<4;i++){nx=a/5;ny=a%5; 32 nx=nx+disx[i];ny=ny+disy[i]; 33 b=nx*5+ny; 34 if(nx>=0&&ny>=0&&nx<5&&ny<5&&!visit[b]&&!map[b]){ 35 visit[b]=1; 36 dl.push(b); 37 pre[b]=a; 38 } 39 } 40 } 41 print(24);//因为只有一个解,所以到最后就行了,如果存在多组解,这种方法就不行了; 42 } 43 int main(){ 44 int x,y; 45 for(int i=0;i<25;i++)scanf("%d",&map[i]); 46 initial(); 47 puts("(0, 0)"); 48 bfs(); 49 return 0; 50 }
迷宫问题
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 39 Accepted Submission(s) : 24
Problem 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)
题解:做了半天,醉了。。。主要是存路径,相当于并查集存,输出用的递归;算是小技巧;这题主要数据太弱,路径如果多了就不行了,只存在一条路径才可以;路径多了可以用优先队列搞,没想到这样就过了。。。。
代码:
1 #include<stdio.h> 2 #include<queue> 3 #include<string.h> 4 using namespace std; 5 int step,t; 6 int visit[25]; 7 int map[25]; 8 int pre[26]; 9 int disx[4]={0,1,0,-1}; 10 int disy[4]={1,0,-1,0}; 11 void initial(){ 12 memset(visit,0,sizeof(visit)); 13 for(int i=0;i<25;i++)pre[i]=-1; 14 } 15 void print(int num){ 16 if(num>=0){ 17 int x=num/5,y=num%5; 18 print(pre[num]); //递归;让从第一个点开始 19 printf("(%d, %d) ",x,y); 20 } 21 } 22 void bfs(){int nx,ny,a,b; 23 queue<int>dl; 24 a=0; 25 dl.push(a); 26 visit[0]=1;memset(pre,-1,sizeof(pre)); 27 pre[0]=-1; 28 while(!dl.empty()){ 29 t=dl.size(); 30 while(t--){ 31 a=dl.front(); 32 dl.pop(); 33 for(int i=0;i<4;i++){nx=a/5;ny=a%5; 34 nx=nx+disx[i];ny=ny+disy[i]; 35 b=nx*5+ny; 36 if(nx>=0&&ny>=0&&nx<5&&ny<5&&!visit[b]&&!map[b]){ 37 visit[b]=1; 38 dl.push(b); 39 pre[b]=a; 40 if(b==24){ 41 print(24); 42 return; 43 } 44 } 45 } 46 } 47 } 48 //因为只有一个解,所以到最后就行了,如果存在多组解,这种方法就不行了; 49 } 50 int main(){ 51 int x,y; 52 for(int i=0;i<25;i++)scanf("%d",&map[i]); 53 initial(); 54 bfs(); 55 return 0; 56 }