POJ 1111

来源:互联网 发布:小岛秀夫 知乎 编辑:程序博客网 时间:2024/06/01 10:11

题目大意:先输入一个矩阵,再输入一个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);
  }
  
 }

}