| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 431 人关注过本帖
标题:迷宫问题
只看楼主 加入收藏
lhp3774848
Rank: 2
来 自:福建省
等 级:论坛游民
帖 子:46
专家分:77
注 册:2011-5-3
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
迷宫问题
走迷宫
    n*n的矩阵,每个元素表示一个格子,取值为0或1,取0表示该格不能走,取1表示可以走。已知矩阵,(其中a[1][1]与a[n][n]取值必为1)。问从a[1][1]到a[n][n]至少要经过几个格(包括首尾两格)。输入第一行为n
第二行到第n+1行,每行n个无素
输出:格子数。
输入样例:
3
1   0   1
1   0   0
1   1   1
输出:5

以下是代码:
#include "stdio.h"
#include "stdlib.h"
int a[100][100];
int mark[100][100];
int f(int m,int n)
{
    int t,min;
    if(m==1&&n==1)return 1;
    a[m][n]=0;
    if(mark[m][n]>=1)return mark[m][n];
    min=10000;
    if(a[m-1][n]==1)
    {
        t=f(m-1,n)+1;
        if(min>t)min=t;
        a[m-1][n]=1;
        
    }
    if(a[m+1][n]==1)
    {
        t=f(m+1,n)+1;
        if(min>t)min=t;
        a[m+1][n]=1;
   
    }
    if(a[m][n+1]==1)
    {
        t=f(m,n+1)+1;
        if(min>t)min=t;
        a[m][n+1]=1;

    }
    if(a[m][n-1]==1)
    {
        t=f(m,n-1)+1;
        if(min>t)min=t;
        a[m][n-1]=1;

    }
    mark[m][n]=min;
    return min;
}
int main ()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=0;i<=n+1;i++)
    {
        a[i][0]=0;
        a[0][i]=0;
        a[i][n+1]=0;
        a[n+1][i]=0;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            scanf("%d",&a[i][j]);
            mark[i][j]=0;
        }
    printf("%d",f(n,n));
    system("pause");
}
这个递归函数看不懂,哪位高手帮我详细解释下啊         谢谢!
搜索更多相关主题的帖子: return 元素 
2011-05-19 19:29
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:20 
程序代码:
int t,min;
    if(m==1&&n==1)return 1;//如果找到的终点 当然一步就可以到达了
    a[m][n]=0;//既然走过了这个点  就要留下痕迹 否则只能在原地打转
    if(mark[m][n]>=1)return mark[m][n];//这里保存了递归的结果 防止重复递归
    min=10000;//定义无穷大
    if(a[m-1][n]==1)//如果上面可以走
    {
        t=f(m-1,n)+1;//那么这个点到终点的距离就等于 上面点到终点的距离加上1
        if(min>t)min=t;//如果从上面走会比从除了上面的某个方向走更短 那就更改min
        a[m-1][n]=1;//这里多余了  这个if 的条件就是a[m-1][n]==1 如果不是1那也进不来
        //下面的和这个一样的道理  不讲了...............
    }
    if(a[m+1][n]==1)
    {
        t=f(m+1,n)+1;
        if(min>t)min=t;
        a[m+1][n]=1;
   
    }
    if(a[m][n+1]==1)
    {
        t=f(m,n+1)+1;
        if(min>t)min=t;
        a[m][n+1]=1;

    }
    if(a[m][n-1]==1)
    {
        t=f(m,n-1)+1;
        if(min>t)min=t;
        a[m][n-1]=1;

    }
    mark[m][n]=min;
    return min;
既然是一个递归  它的边界条件就是找到了a[1][1]这个点

然后它会一步一步的返回
1   0   1
1   0   0
1   1   1

现在假如找到了a[1][1]那么肯定是 a[2][1]找到的a[1][1] 所以a[2][1]步数就是2

那么又是谁找到的a[2][1] 肯定是a[3][1]  ............以此类推

其实这种算法时间和空间复杂度都很高  楼主可以看一下图的广度优先搜索 和 A*算法这两种最短路径求法

                                         
===========深入<----------------->浅出============
2011-05-19 20:02
lhp3774848
Rank: 2
来 自:福建省
等 级:论坛游民
帖 子:46
专家分:77
注 册:2011-5-3
收藏
得分:0 
谢谢楼上讲得这么详细,虽然还是有点不懂,但回去理解清楚的。
2011-05-20 11:13
快速回复:迷宫问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025261 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved