水管工游戏

来源:互联网 发布:手机文字读音软件 编辑:程序博客网 时间:2024/04/27 16:15


  • 游戏规则

一块矩形土地被分隔N*M的单位正方形,现在这块土地上已经埋设一些水管,水管将从坐标(1,1)的矩形土地的左上角左部边缘,延伸到坐标(N,M)的矩形土地的右下角边缘。水管只有两种。一种弯的,一种直的。
每种管道将占据一个单位正方形土地。你现在可以旋转这些管道,使得其构成一个管道系统。标有树木的方格表示这里没有管道。
输入的第一行为两个整数N和M,接下来输入N行,每行有M个整数,表示地图中的每一个格子。其中0表示树木,1-6表示管道的六种不同的摆放方式。

使用深度优先搜索解决

当处在第x行第y列的时候,需要枚举当前管道的每一张摆放方式。直管有两种,弯管有四种,此外并不是每一种都可以,还需要判断进水口的方向才可以。

void dfs(int x, int y, int front)//x和y表示当前处理格子的坐标,front表示进水口的方向{    //判断是否越界    if(x<1 || x>n || y<1 || y>n)        return;    //判断这个管道是否在路径中使用过    if(book[x][y]==1)        return;    book[x][y]=1;//标记当前使用的这个管道    //当前水管是直管的情况    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);        }    }    book[x][y]=0;//取消标记    return;}

实现代码(使用了栈保存路径)

/*    深度优先搜索解决铺水管问题*/#include<stdio.h>int a[51][51];//假设土地的大小不超过50*50int book[51][51];int n, m,flag=0;struct note{    int x;//横坐标    int y;//纵坐标}s[100];int top;void dfs(int x, int y, int front){    int i;    //判断是否到达了中点    if(x==n && y==m+1){        flag=1;//找到铺设方案        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);//1号状态                dfs(x, y-1,3);//4号状态            }            if(front==3)            {                dfs(x-1,y,4);//1号状态                dfs(x+1,y,2);//2号状态            }            if(front==4)            {                dfs(x, y+1,1);//2号状态                dfs(x, y-1,3);//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("No");        else{            printf("ok");        }}
原创粉丝点击