#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,就減少一條邊