迷宫问题

 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)\n",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
定义一个二维数组:

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)\n",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 }

 

posted @ 2015-08-06 11:39  handsomecui  阅读(229)  评论(0编辑  收藏  举报