| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3604 人关注过本帖
标题:啊哈!算法里的水管工游戏问题
取消只看楼主 加入收藏
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
结帖率:66.67%
收藏
已结贴  问题点数:26 回复次数:2 
啊哈!算法里的水管工游戏问题
为什么要取消标记????
递归函数中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 21:30
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
收藏
得分:0 
回复 2楼 书生牛犊
有没有book【x】【y】=0;结果都一样为什么呢
2016-09-13 19:08
水桃蜜蜜
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2016-5-9
收藏
得分:0 
回复 5楼 书生牛犊
谢谢!!!我结贴了
2016-09-13 21:01
快速回复:啊哈!算法里的水管工游戏问题
数据加载中...
 
   



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

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