题目大意:先输入一个矩阵,再输入一个X的位置,然后输出与这个X在八个方向能够连起来的所有X组成的图形的周长。
很简单的题目。基本可以说是个水题,不过在求周长反方面有点难度。我采用的是笨方法:如果有一个边被2个(最多有2个)X包含,哪么令这条边为0,否则为1
#include<iostream>
using namespace std;
void DFS(int x,int y);
char a[110][110];
bool H[200][200];
bool V[200][200];
int m,n;
int x,y;
struct item
{
int x;
int y;
};
item dir[8];
int main()
{
dir[0].x=-1;
dir[0].y=0;
dir[1].x=1;
dir[1].y=0;
dir[2].x=0;
dir[2].y=-1;
dir[3].x=0;
dir[3].y=1;
dir[4].x=-1;
dir[4].y=-1;
dir[5].x=-1;
dir[5].y=1;
dir[6].x=1;
dir[6].y=-1;
dir[7].x=1;
dir[7].y=1;
int result;
int i,j;
while(cin>>m>>n>>x>>y)
{
memset(H,0,sizeof(H));
memset(V,0,sizeof(V));
result=0;
if(m==0&&n==0)
break;
for(i=0;i<m;i++)
{
scanf("%s",a[i]);
}
x=x-1;
y=y-1;
a[x][y]='.';
H[x][y]=H[x][y]+1;
H[x+1][y]=H[x+1][y]+1;
V[x][y]=V[x][y]+1;
V[x][y+1]=V[x][y+1]+1;
DFS(x,y);
for(i=0;i<=m;i++)
for(j=0;j<=n;j++)
{
result+=H[i][j]+V[i][j];
}
cout<<result<<endl;
}
return 0;
}
void DFS(int x,int y)
{
int i;
int g,h;
for(i=0;i<8;i++)
{
g=x+dir[i].x;
h=y+dir[i].y;
if(g<0||h<0||g>=m||h>=n)
continue;
if(a[g][h]=='X')
{
a[g][h]='.';
H[g][h]=(H[g][h]+1)%2;
H[g+1][h]=(H[g+1][h]+1)%2;
V[g][h]=(V[g][h]+1)%2;
V[g][h+1]=(V[g][h+1]+1)%2;
DFS(g,h);
}
}
}