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