#include <iostream>
#include <stdio.h>
using namespace std;
int a[30][30],b[30][30],n,m,x,y,que[900][2],f,r;
int dicx[8]={1,1,1,0,0,-1,-1,-1},
dicy[8]={-1,0,1,-1,1,-1,0,1},
dx[4]={1,-1,0,0},
dy[4]={0,0,1,-1};
int main()
{ int i,j,xx,yy,k,sum;
char w;
//freopen("in.txt","r",stdin);
cin>>m>>n>>x>>y;
while (m+n+x+y>0)
{for (i=0;i<=m+1;i++)
for (j=0;j<=n+1;j++)
{
a[i][j]=0;
b[i][j]=0;
}
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
cin>>w;
if (w=='X') a[i][j]=1;
}
for (i=0;i<900;i++)
for (j=0;j<=1;j++) que[i][j]=0;
f=1;r=1;que[1][0]=x;que[1][1]=y;a[x][y]=-1;//入队,做标记
while (f<=r)
{ //for (i=1;i<=r;i++) cout<<que[i][0]<<" "<<que[i][1]<<endl;cout<<endl;
xx=que[f][0];yy=que[f][1];
//a[xx][yy]=-1;
for (k=0;k<8;k++) //各个方向
if (xx+dicx[k]>=1&&xx+dicx[k]<=m&&yy+dicy[k]>=1&&yy+dicy[k]<=n
&&a[xx+dicx[k]][yy+dicy[k]]==1) //没越界没走过
{
r++; //入队,做标记
a[xx+dicx[k]][yy+dicy[k]]=-1;
que[r][0]=xx+dicx[k];
que[r][1]=yy+dicy[k];
}
f++;
}
//for (i=1;i<=m;i++){for (j=1;j<=n;j++) cout<<a[i][j]<<" ";cout<<endl;}
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
if (a[i][j]==-1)
{
b[i][j]=4;
for (k=0;k<4;k++) //有一个相邻的x,就减少一条边
if (a[i+dx[k]][j+dy[k]]==-1) b[i][j]--;
}
sum=0;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++) sum+=b[i][j]; //总边数及周长
cout<<sum<<endl;
cin>>m>>n>>x>>y;
}
return 0;
}
题意: 先输入一个矩阵,再输入一个X的位置,然后输出与这个X在八个方向能够连起来的所有X组成的图形的周长。
思路:宽搜,求出能连在一起的x,假设每个要4条线围起来,有一个相邻的x,就减少一条边