Jasmine_huang 2016-09-12 13:39 采纳率: 50%
浏览 1262

啊哈!算法水管工游戏为什么要取消标记

为什么要取消标记????
递归函数中return;是直接跳出整体函数,还是跳出当前函数回到上一层dfs所在位置继续进行之后的代码啊????

#include
#include
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(xn || ym)
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
*/

  • 写回答

1条回答 默认 最新

  • devmiao 2016-09-12 15:58
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型