题目来源:[NWPU][2014][TRN][4]搜索 F 题
http://vjudge.net/contest/view.action?cid=49557#problem/F
作者:npufz
题目:用“X,.”矩阵模拟一个区域,用X表示对象的一部分,用"."表示空间,给定矩阵后,再给定一个X点的坐标,找出这个对象的边长,和X相连接的X都属于这个对象,不相邻的X
属于另一个对象,一个X与左右上下,左上,左下,右上,右下的X相邻,矩阵最大不超过20*20
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{ int a[23][23],i,j,w,h,w1,h1,x1,y1,sum,cd;
char ch[23][23];
typedef pair<int,int> wh;scanf("%d%d%d%d",&h,&w,&h1,&w1);
while(h!=0&&w!=0&&h1!=0&&w1!=0)
{ for(i=0;i<h;i++)
for(j=0;j<w;j++)
{scanf(" %c",&ch[i][j]);a[i][j]=0;}
wh wh0;
queue<wh> que;
h1--;w1--;
while(!que.empty()) que.pop();
que.push(wh(h1,w1));a[h1][w1]=1;
while(que.size())
{wh0=que.front();que.pop();
for(y1=-1;y1<2;y1++)
for(x1=-1;x1<2;x1++)
{h1=wh0.first+y1;
w1=wh0.second+x1;
if(h1>=0&&h1<h&&w1>=0&&w1<w&&ch[h1][w1]=='X')
{ch[h1][w1]='.';a[h1][w1]=1;que.push(wh(h1,w1));}}}
sum=0;
for(i=0;i<h;i++)
for(j=0;j<w;j++)
{ cd=4;
if(a[i][j]==1)
{if(i-1>=0&&a[i-1][j]==1) cd--;
if(j-1>=0&&a[i][j-1]==1) cd--;
if(i+1<h&&a[i+1][j]==1) cd--;
if(j+1<w&&a[i][j+1]==1) cd--;
sum+=cd; }}
cout<<sum<<endl;scanf("%d%d%d%d",&h,&w,&h1,&w1);}
return 0;
}
反思:开始时读入的数据矩阵的语句为SCANF(" %c ");由于读入的最后有一个空格,它屏蔽掉了所有的空白符,所以输入一组数据时,没有返回值,只有输入下一组数据时 才有返回值,但由于最后的输入了一组0000,所以仍然A掉了