啊哈算法DFS应用之水管工游戏

//管子有六个状态,具体见啊哈算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
    int x;
    int y;
};
struct node stack[100];//用栈存储路径
int top=-1;
int n;//图的规模
int map[51][51];//存图
int book[51][51];//标记走过的点
void dfs(int x,int y,int front)//front表示此点进水口,1,2,3,4表示左上右下
{
    if(x==n&&y==n+1){
        for(int i=0;i<=top;i++)
            printf("(%d,%d)%c",i==top?'\n':' ');
        return;
    }
    if(x<1||x>n||y<1||y>n)
        return;
    if(book[x][y]==1)
        return;

    book[x][y]=1;
    top++;
    stack[top].x=x;
    stack[top].y=y;

    //假如此管子为直管
    if(map[x][y]>=5&&map[x][y]<=6){
        if(front==1)
          dfs(x,y+1,1);
        else if(front==2)
          dfs(x+1,y,2);
        else if(front==3)
          dfs(x,y-1,3);
        else if(front==4)
          dfs(x-1,y,4);
    }

    //假如此管子是弯管
    if(map[x][y]>=1&&map[x][y]<=4){
        if(front==1){
           dfs(x-1,y,4);
           dfs(x+1,y,2);
        }
        else if(front==2){
           dfs(x,y-1,3);
           dfs(x,y+1,1);
        }
        else if(front==3){
           dfs(x-1,y,4);
           dfs(x+1,y,2);
        }
        else if(front==4){
           dfs(x,y+1,1);
           dfs(x,y-1,3);
        }
    }
    //取消标记
    book[x][y]=0;
    top--;
    return;

}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
           scanf("%d",&map[i][j]);
    for(int i=0;i<51;i++)
        memset(book[i],0,sizeof(book[i]));
    dfs(1,1,1);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值