HDU 1198 :Farm Irrigation

版权声明:本文为博主原创文章,转载请注明。 https://blog.csdn.net/qq_41181881/article/details/82845072

题目链接

解题思路:(dfs思路)通过构图,记录每条路的通向方向(定义一个数组存储各条路通向的方向),在去寻找下一个田地是否连通,并且一个一个寻找,并标记。

代码内详细讲解:

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int f[4][2]={-1,0,1,0,0,-1,0,1};//上下左右
int map[11][4]={//地图的分布,上下左右,1代表通,0代表不通 ,按照A-K图的顺序打出下表
{1,0,1,0},{1,0,0,1},
{0,1,1,0},{0,1,0,1},
{1,1,0,0},{0,0,1,1},
{1,0,1,1},{1,1,1,0},
{0,1,1,1},{1,1,0,1},
{1,1,1,1}};
int m,n;
int vis[55][55];//用来标记走过的路
char d[55][55];
void dfs(int x,int y)
{
    vis[x][y]=1;//标记走过的
    for(int i=0;i<4;i++)
    {
        int xx=x+f[i][0];//控制x轴坐标
        int yy=y+f[i][1];//控制y轴坐标
        int j;
        if(i==0||i==1)//根据移动的方向 提前确定下一块田需要连接的方向
        {
            j=(i+1)%2;
        }
        else if(i==2)
        {
            j=3;
        }
        else
        {
            j=2;
        }
        if(xx>=0 && yy>=0 && xx<n && yy<m && !vis[xx][yy] && map[d[x][y]-'A'][i]==1 && map[d[xx][yy]-'A'][j]==1)
        {//前4个条件判断是否越界和是否走过;5:判断当前位置是否通向(xx,yy);
         //6:判断(xx,yy)是否有连接的路
            dfs(xx,yy);
        }
    }
}
int main()
{
    while(~scanf("%d %d",&n,&m))
    {
        if(n==-1&&m==-1)
        {
            break;
        }
        getchar();
        memset(vis,0,sizeof(vis));
        int sum=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s",d[i]);
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                if(!vis[i][j])
                {
                    sum++;
                    dfs(i,j);
                }

            }
        }
        printf("%d\n",sum);

    }
}

猜你喜欢

转载自blog.csdn.net/qq_41181881/article/details/82845072