ZOJ 2412 Farm Irrigation

来源:互联网 发布:中国电信云计算干嘛的 编辑:程序博客网 时间:2024/05/29 19:14

题意:

将大写字母A~K转化为相应的图形 ,然后输出M行N列的大写字母,通过图形转换变成一个大图形,从图形中找出相通道路的个数。。


思路:

将大写字母转化成矩阵,1代表可通行,0代表不可通行。然后DFS。

A  转化成     

0 1 0

1 1 0

0 0 0

B  转化成

0 1 0

0 1 1

0 0 0

然后我们通过整数将矩形的信息储存起来。

如A:010110000    整数:1011000

    B:010011000    整数:10011000


代码:

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int dr[][2]={{-1,0},{1,0},{0,-1},{0,1}};    //上下左右//用map数组将矩阵信息存储起来int map[11]=      {10110000,10011000,110010,11010,10010010,111000,10111000,10110010,111010,10011010,10111010      };int n,m;//分别为矩阵数组和字母数组int  str[300][300];char  ans[100][100];void dfs(int x,int y)    {   if(x<=0||y<=0||y>m*3||x>n*3||str[x][y]==0)     //越界或者被无法通行或者被访问过的return;str[x][y]=0;                                             //标记被访问过的  for(int i=0;i<4;i++)                                     // DFS各方向      dfs(x+dr[i][0],y+dr[i][1]);}int main(){freopen("read.txt","r",stdin);                                 while(scanf("%d %d",&n,&m)!=EOF){if(n==-1&&m==-1)  return 0;getchar();for(int i=1;i<=n;i++)scanf("%s",ans[i]);       //转化成矩阵  将可通行的路转化为1 //如  A  转化成//   0   1   0//   1   1   0//   0   0   0   memset(str,0,sizeof(str)); for(int i=1;i<=n;i++){  for(int j=0;j<m;j++)  {    int a=ans[i][j]-'A';    int b=100000000;                                               //利用求余求模将“整数”信息存储到矩阵数组中  for(int k=1;k<=3;k++)     for(int h=1;h<=3;h++) {  str[(i-1)*3+k][j*3+h]=(map[a]/b)%10;b/=10;  }  }       }//搜索int sum=0;      for(int i=1;i<=n*3;i++)for(int j=1;j<=m*3;j++)  {               if(str[i][j]==1)     // 找到未访问的 { sum++; dfs(i,j); }  } printf("%d\n",sum);      }    return 0;}


0 0
原创粉丝点击