| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1229 人关注过本帖
标题:水管工游戏取消标记的问题
只看楼主 加入收藏
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
结帖率:66.67%
收藏
 问题点数:0 回复次数:7 
水管工游戏取消标记的问题
为什么要取消标记????
递归函数中return;是直接跳出整体函数,还是跳出当前函数回到上一层dfs所在位置继续进行之后的代码啊????

#include <stdio.h>
#include <stdlib.h>
int a[51][51];
int book[51][51],n,m,flag=0;
struct note
{
    int x;
    int y;
}s[100];
int top=0;

void dfs(int x,int y,int front)
{
    int i;
    if(x==n && y==m+1)
    {
        flag=1;
        for(i=1;i<=top;i++)
        {
            printf("(%d,%d)",s[i].x,s[i].y);
        }
        return;
    }
    //判断是否越界
    if(x<1 || x>n || y<1 || y>m)
        return;
    //判断这个管道是否在路径中已经使用过
    if(book[x][y]==1)
    {
        return;
    }
    book[x][y]=1;//标记使用当前这个管道

    top++;
    s[top].x=x;
    s[top].y=y;
    //当前水管是直管的情况
    if(a[x][y]>=5 && a[x][y]<=6)
    {
        if(front==1)//进水口在左边的情况
        {
            dfs(x,y+1,1);
        }
        if(front==2)
        {
            dfs(x+1,y,2);
        }
        if(front==3)
        {
            dfs(x,y-1,3);
        }
        if(front==4)
        {
            dfs(x-1,y,4);
        }
    }
    if(a[x][y]>=1 && a[x][y]<=4)
    {
        if(front==1)//进水口在左边的情况
        {
            dfs(x+1,y,2);
            dfs(x-1,y,4);
        }
        if(front==2)
        {
            dfs(x,y+1,1);
            dfs(x,y-1,3);
        }
        if(front==3)
        {
            dfs(x-1,y,4);
            dfs(x+1,y,2);
        }
        if(front==4)
        {
            dfs(x,y+1,1);
            dfs(x,y-1,3);
        }
    }
/******************************************************取消标记*************/
    book[x][y]=0;/*******************************************************问题在这里*************/
    top--;/*******************************************************问题在这里*************/
    return;
}
int main()
{
    int i,j,num=0;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    dfs(1,1,1);
    if(flag==0)
        printf("impossible\n");
    else
        printf("找到铺设方案\n");
    return 0;
}
/*
5 4
5 3 5 3
1 5 3 0
2 3 5 1
6 1 1 5
1 5 5 4
*/
搜索更多相关主题的帖子: include return 游戏 
2016-09-12 22:13
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
递归函数中return;不是直接跳出整体函数,是跳出当前函数回到上一层dfs所在位置继续进行之后的代码!

void Test(int n){
if(n>0)Test(n-1);
printf("%d ",n);
return;//这里主要是为了你看得更清楚,所以加上return。void函数本身是可以省略的
}
int main(){
Test(10);
}

φ(゜▽゜*)♪
2016-09-12 22:20
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
我的猜想,不对不要骂。
 book[x][y]=0;这句在楼主的代码中可有可无,不影响最终结果。
 楼主既然说是水管工的游戏,那么void dfs(int x,int y,int front)这个函数很可能不是运行一遍,而是要多次调用。
如果不取消标记,很有可能影响下次的调用结果。
楼主可以试试在主函数上加一个循环来调用void dfs(int x,int y,int front)。对比有无这句book[x][y]=0;得出的结果是怎样。
2016-09-13 12:45
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
收藏
得分:0 
回复 3楼 linlulu001
有没有book【x】【y】=0;结果都一样为什呢
2016-09-13 19:07
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1744
专家分:3216
注 册:2015-12-2
收藏
得分:0 
没见过这个游戏,不懂。
2016-09-13 19:22
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
回复 4楼 水桃蜜蜜
我看你不是只有book【x】【y】=0这句不理解,而是整个void dfs(int x,int y,int front)递归函数压根就是有看没有懂。
帮不到你了。
2016-09-13 19:28
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
关键是啊哈磊给出的测试案例总共只有1条可行道路。所以你把book[x][y]=0注释掉也能输出一样的代码


[此贴子已经被作者于2016-9-13 20:21编辑过]


φ(゜▽゜*)♪
2016-09-13 19:49
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
收藏
得分:0 
回复 7楼 书生牛犊
问题解决了https://bbs.bccn.net/thread-468743-1-1.html在这里
收到的鲜花
  • 书生牛犊2016-09-13 22:09 送鲜花  10朵   附言:好习惯!
2016-09-13 21:03
快速回复:水管工游戏取消标记的问题
数据加载中...
 
   



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

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