zoukankan      html  css  js  c++  java
  • XMU C语言程序设计实践(3)

    问题描述:

    以一个n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

    对于本问题需用栈实现“穷举求解”算法,即:从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。加入所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫数据是一个n阶矩阵用二维数组存储,起点为(1,1),终点为(n,n),再在迷宫外围加上一层围墙(默认为1,不需用户输入,用户只需输入迷宫数据即可),对于迷宫中每个数据都有四个方向可通。

    具体实现算法的函数及要点如下:初始化栈,销毁栈,清空栈,判栈空,取栈顶元素,插入新的栈顶元素,删除栈顶元素,从栈底到栈顶依次访问栈中的每个结点,最重要的就是要判断迷宫的通路。

    从迷宫的入口到出口找出一条通路的算法如下:

    设定当前位置的初值为入口位置;

    Do

    {

    若当前位置可通,

        则

    {

    将当前位置插入栈顶;

    若该位置是出口位置,则算法结束;

                      否则切换当前位置的东邻方块为新的位置;

             }

        否则

    {

    回到当前位置的前一个位置,判断是否可通(类似于上面算法)

                      ……

        }

    }while(栈不空);

    若栈不空且栈顶位置尚有其他方向未被探索,

    则设定新的当前位置为: 沿顺时针方向旋转

    找到的栈顶位置的下一相邻块;

    若栈不空但栈顶位置的四周均不可通,

    删去栈顶位置;// 从路径中删去该通道块

    若栈不空,则重新测试新的栈顶位置,

    直至找到一个可通的相邻块或出栈至栈空;

    若栈空,则表明迷宫通路。

    最后根据栈储存的数据输出迷宫径即可。

    递归:

     1 //
     2 //by coolxxx
     3 //
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<string.h>
     7 #define max(a,b) ((a)>(b)?(a):(b))
     8 #define min(a,b) ((a)<(b)?(a):(b))
     9 #define abs(a) ((a)>0?(a):(-(a)))
    10 #define sqr(a) ((a)*(a))
    11 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
    12 #define eps 1e-8
    13 #define MAX 0x7f7f7f7f
    14 #define N 1004
    15 #define M 1000004
    16 char map[N][N];
    17 int u[N][N];
    18 int n,m,ans,lll;
    19 int dx[]={-1,1,0,0};
    20 int dy[]={0,0,-1,1};
    21 int a[M][2];
    22 void pop()
    23 {
    24     a[lll][0]=a[lll][1]=0;
    25     lll--;
    26 }
    27 void push(int x,int y)
    28 {
    29     a[++lll][0]=x;
    30     a[lll][1]=y;
    31 }
    32 void gettop(int *x,int *y)
    33 {
    34     *x=a[lll][0];
    35     *y=a[lll][1];
    36 }
    37 int uempty()
    38 {
    39     return lll;
    40 }
    41 void init()
    42 {
    43     int i;
    44     memset(a,0,sizeof(a));
    45     memset(u,0,sizeof(u));
    46     lll=0;
    47 }
    48 int dfs(int x,int y)
    49 {
    50     if(x==n && y==n && map[x][y]=='0')
    51         return 1;
    52     int i,j,xx,yy;
    53     u[x][y]=1;
    54     for(i=0;i<4;i++)
    55     {
    56         xx=x+dx[i];
    57         yy=y+dy[i];
    58         if(xx<1 || yy<1 || xx>n || yy>n || map[xx][yy]=='1' || u[xx][yy])continue;
    59         j=dfs(xx,yy);
    60         if(j)
    61         {
    62             push(xx,yy);
    63             return 1;
    64         }
    65     }
    66     return 0;
    67 }
    68 int main()
    69 {
    70     freopen("1.txt","r",stdin);
    71     int i,j;
    72     scanf("%d",&n);
    73     for(i=1;i<=n;i++)
    74     {
    75         scanf("%s",map[i]+1);
    76         puts(map[i]+1);
    77     }
    78     if(map[1][1]=='1'){puts("No way");return 0;}
    79     init();
    80     if(dfs(1,1))
    81     {
    82         push(1,1);
    83         for(i=lll;i>1;i--)
    84             printf("(%d,%d)->",a[i][0],a[i][1]);
    85         printf("(%d,%d)
    ",n,n);
    86     }
    87     else
    88     {
    89         puts("No way");
    90     }
    91     return 0;
    92 }
    93 /*
    94 
    95 */
    View Code

    非递归:

     1 //
     2 //by coolxxx
     3 //
     4 #include<stdio.h>
     5 #include<stdlib.h>
     6 #include<string.h>
     7 #define max(a,b) ((a)>(b)?(a):(b))
     8 #define min(a,b) ((a)<(b)?(a):(b))
     9 #define abs(a) ((a)>0?(a):(-(a)))
    10 #define sqr(a) ((a)*(a))
    11 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
    12 #define eps 1e-8
    13 #define MAX 0x7f7f7f7f
    14 #define N 1004
    15 #define M 1000004
    16 char map[N][N];
    17 int u[N][N];
    18 int n,m,ans,lll;
    19 int dx[]={-1,1,0,0};
    20 int dy[]={0,0,-1,1};
    21 int a[M][2];
    22 void pop()
    23 {
    24     a[lll][0]=a[lll][1]=0;
    25     lll--;
    26 }
    27 void push(int x,int y)
    28 {
    29     a[++lll][0]=x;
    30     a[lll][1]=y;
    31 }
    32 void gettop(int *x,int *y)
    33 {
    34     *x=a[lll][0];
    35     *y=a[lll][1];
    36 }
    37 int uempty()
    38 {
    39     return lll;
    40 }
    41 void init()
    42 {
    43     int i;
    44     memset(a,0,sizeof(a));
    45     memset(u,0,sizeof(u));
    46     lll=0;
    47 }
    48 void print()
    49 {
    50     int i,j;
    51     for(i=1;i<lll;i++)
    52         printf("(%d,%d)->",a[i][0],a[i][1]);
    53     printf("(%d,%d)
    ",n,n);
    54 }
    55 void dfs()
    56 {
    57     int i,j,x,y,xx,yy;
    58     gettop(&x,&y);
    59     if(x==n && y==n && map[x][y]=='0')
    60     {
    61         print();
    62         exit(0);
    63     }
    64     for(i=0;i<4;i++)
    65     {
    66         xx=x+dx[i];
    67         yy=y+dy[i];
    68         if(xx<1 || yy<1 || xx>n || yy>n || map[xx][yy]=='1' || u[xx][yy])continue;
    69         push(xx,yy);
    70         u[xx][yy]=1;
    71         dfs();
    72         pop(xx,yy);
    73     }
    74 }
    75 int main()
    76 {
    77     freopen("1.txt","r",stdin);
    78     int i,j;
    79     scanf("%d",&n);
    80     for(i=1;i<=n;i++)
    81     {
    82         scanf("%s",map[i]+1);
    83         puts(map[i]+1);
    84     }
    85     if(map[1][1]=='1'){puts("No way");return 0;}
    86     push(1,1);
    87     dfs(1,1);
    88     puts("No way");
    89     return 0;
    90 }
    91 /*
    92 
    93 */
    View Code
  • 相关阅读:
    9.11 eventbus
    9.10,,,实现new instanceof apply call 高阶函数,偏函数,柯里化
    9.9 promise实现 写完了传到gitee上面了,这里这个不完整
    9.5cors配置代码
    9.5 jsonp 实现
    9.5 http tcp https总结
    9.3 es6 class一部分 and es5 class 发布订阅
    8.30 cookie session token jwt
    8.30vue响应式原理
    warning: LF will be replaced by CRLF in renard-wx/project.config.json. The file will have its original line endings in your working directory
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/7090796.html
Copyright © 2011-2022 走看看