码迷,mamicode.com
首页 > 其他好文 > 详细

hdu Farm Irrigation

时间:2015-07-20 10:36:14      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:

这题第一感觉是用搜索做,暴力就可以解决,这里将水管转换成一个个3*3的矩阵,然后搜素就可以了。写完之后确实一遍过掉了,31ms。附上代码:

技术分享
#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"cmath"
#include"queue"
#include"stack"
#include"vector"
#include"string"
#include"string.h"
using namespace std;
const int mx=1005;
int A[3][3]={{0,1,0},{1,1,0},{0,0,0}};
int B[3][3]={{0,1,0},{0,1,1},{0,0,0}};
int C[3][3]={{0,0,0},{1,1,0},{0,1,0}};
int D[3][3]={{0,0,0},{0,1,1},{0,1,0}};
int E[3][3]={{0,1,0},{0,1,0},{0,1,0}};
int F[3][3]={{0,0,0},{1,1,1},{0,0,0}};
int G[3][3]={{0,1,0},{1,1,1},{0,0,0}};
int H[3][3]={{0,1,0},{1,1,0},{0,1,0}};
int I[3][3]={{0,0,0},{1,1,1},{0,1,0}};
int J[3][3]={{0,1,0},{0,1,1},{0,1,0}};
int K[3][3]={{0,1,0},{1,1,1},{0,1,0}};
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int maze[mx][mx];
bool visited[mx][mx];
int m,n,wellspring;
bool judge(int x,int y)
{
    if(x>=0&&x<3*m&&y>=0&&y<3*n&&maze[x][y]==1&&!visited[x][y])
        return true;
    return false;
}
void dfs(int x,int y)
{
    int dx,dy;
    for(int i=0;i<4;i++)
    {
        dx=x+dir[i][0];
        dy=y+dir[i][1];
        if(judge(dx,dy))
        {
            visited[dx][dy]=true;
             dfs(dx,dy);
        }
    }
}
void creat_maze(int a[][3],int i,int j)
{
    int p,q;
    for(p=i*3;p<i*3+3;p++)
    {
        for(q=j*3;q<j*3+3;q++)
        {
            maze[p][q]=a[p-i*3][q-j*3];
        }
    }
}
void wellspring_count()
{
    int i,j;
    for(i=0;i<3*m;i++)
    {
        for(j=0;j<3*n;j++)
        {
            if(maze[i][j]==1&&!visited[i][j])
            {
                wellspring++;
                visited[i][j]=true;
                dfs(i,j);
            }
        }
    }
    printf("%d\n",wellspring);
}
void input()
{
    int i,j;
    while(scanf("%d%d",&m,&n),m!=-1||n!=-1)
    {
        memset(visited,false,sizeof(visited));
        wellspring=0;
        char pipe;
        for(i=0;i<m;i++)
       {
           getchar();
        for(j=0;j<n;j++)
        {
            scanf("%c",&pipe);
            switch(pipe)
            {
                case A: creat_maze(A,i,j);break;
                case B: creat_maze(B,i,j);break;
                case C: creat_maze(C,i,j);break;
                case D: creat_maze(D,i,j);break;
                case E: creat_maze(E,i,j);break;
                case F: creat_maze(F,i,j);break;
                case G: creat_maze(G,i,j);break;
                case H: creat_maze(H,i,j);break;
                case I: creat_maze(I,i,j);break;
                case J: creat_maze(J,i,j);break;
                case K: creat_maze(K,i,j);break;
            }
        }
       }
        wellspring_count();
    }
}

int main()
{
 //   freopen("E:\\in.txt","r",stdin);
    input();
    return 0;
}
View Code

但是这是一个并查集专题里的题,所以应该还会有更高效的方法,毕竟我的代码里没有用到并查集。

所以又想了一下,瞬变看了一下别人的并查集思路,又写了一个代码。

 

hdu Farm Irrigation

标签:

原文地址:http://www.cnblogs.com/acm-jing/p/4660626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!