1. 程式人生 > >HDU 1198 :Farm Irrigation

HDU 1198 :Farm Irrigation

題目連結

解題思路:(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);

    }
}