zoukankan      html  css  js  c++  java
  • 迷宫问题

     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
    定义一个二维数组:

    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 }
  • 相关阅读:
    Linux 使用Crontab设置定时调用Shell文件
    Oracle SqlDeveloper创建JOB
    数据仓库搭建步骤
    Linux学习内容
    Windows平台手动卸载Oracle Server【完整+干净】
    ORA-12638:身份证明检索失败
    成功数据迁移的详细步骤
    SQL Server 日期转换到字符串
    删除无用文件,清理硬盘
    KMS安装后激活机器
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4707541.html
Copyright © 2011-2022 走看看