ZOJ 2412 Farm Irrigation

题意:

将大写字母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;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值