hdu1198 Farm Irrigation DFS

来源:互联网 发布:ios软件安装失败 编辑:程序博客网 时间:2024/05/18 01:28

http://acm.hdu.edu.cn/showproblem.php?pid=1198
核心思想是dfs,非常简单,一个地和另一个地在邻边上都有水道即连通,用标记求出连通子图数量即可。

但是题目故意出出来恶心死人

对于这样的题目,a了没意思,你还得写的最短,才算是过,对不对。

我们把题目中的几个样式图都存到数组里去,存的方式是一个图对应4个bool变量,分别是上下左右是否有管道

记得把0位置留给没有任何管道的图,我们把这个要求的图的周围都填上这种没有任何管道的图(通过memset),就不用管边界了。

#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<sstream>#include<stack>#include<queue>#include<fstream>#include<algorithm>#include<map>#include<set>#include<vector>#include<cmath>#define CLR(x) memset(x,0,sizeof(x))#define SETMAX(x) memset(x,0x3f,sizeof(x));#define ll long long#define eps 1e-6#define pow2(x) ((x)*(x))#define forto(i,n) for(int i=0;i<n;i++)#define for1to(i,n) for(int i=1;i<=n;i++)#define VI vector<int>using namespace std;const double PI=acos(-1.0);#define INF 0x3f3f3f3f#define NINF 0xbfffffffusing namespace std;int dir[][2]={{-1,0},{0,1},{1,0},{0,-1}};bool Dir[][4]=      //分别对应  保留图、A、B、C、D……{{0,0,0,0},{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};int M[55][55];bool Visit[55][55];void dfs(int x,int y){    forto(i,4)    {        int tarx(x+dir[i][0]);        int tary(y+dir[i][1]);        if (        !Visit[tarx][tary]&&        Dir[M[x][y]][i]&&Dir[M[tarx][tary]][(i+2)%4]   ///(i+2)%4是对边        )        {            Visit[tarx][tary]=true;            dfs(tarx,tary);        }    }}int main(){    cin.sync_with_stdio(false);    #ifndef ONLINE_JUDGE    freopen("test.txt","r",stdin);    #endif // ONLINE_JUDGE    int n,m;    while (cin>>n>>m,n!=-1||m!=-1)    {        char tp;        CLR(Visit);        CLR(M);        for1to(i,n)        {            for1to(j,m)            {                cin>>tp;                M[i][j]=tp-'A'+1;  //0是保留的无管道的样式,1是A图            }        }        int result(0);        for1to(i,n)        {            for1to(j,m)            {                if (!Visit[i][j])                {                    Visit[i][j]=true;                    result++;                    dfs(i,j);                }            }        }        cout<<result<<endl;    }    return 0;}
0 0
原创粉丝点击