http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=47
#include<iostream>
#include<queue>
#include<string>
using namespace std;
struct Node
  {
int vi;
int vj;
};
string str[21];
bool mark[21][21];
int m,n,si,sj,sum;
 int dir[8][2]= { {-1,0}, {1,0}, {0,-1}, {0,1}, {-1,-1}, {1,-1}, {-1,1}, {1,1}};
//八个方向
void bfs()
  {
int k;
Node p,q;
queue<Node>Q;
p.vi=si;
p.vj=sj;
mark[si][sj]=1;
Q.push(p);
while(!Q.empty())
 {
q=Q.front();
Q.pop();
for(k=0;k<4;k++)//上、下、左、右
 {
p.vi=q.vi+dir[k][0];
p.vj=q.vj+dir[k][1];
if(p.vi>=0 && p.vi<m && p.vj>=0 && p.vj<n)
 {
if(str[p.vi][p.vj]=='.')
sum++;
else if(str[p.vi][p.vj]=='X' && mark[p.vi][p.vj]==0)
 {
mark[p.vi][p.vj]=1;
Q.push(p);
}
}
else
sum++;
}
for(k=4;k<8;k++)//左上、左下、右上、右下
 {
p.vi=q.vi+dir[k][0];
p.vj=q.vj+dir[k][1];
if(p.vi>=0 && p.vi<m && p.vj>=0 && p.vj<n)
 {
if(str[p.vi][p.vj]=='X' && mark[p.vi][p.vj]==0)
 {
mark[p.vi][p.vj]=1;
Q.push(p);
}
}
}
}//while(!Q.empty())
}

int main()
  {
while(cin>>m>>n>>si>>sj && m+n+si+sj)
 {
si--;
sj--;
int i,j;
for(i=0;i<m;i++)
cin>>str[i];
sum=0;
memset(mark,0,sizeof(mark));
bfs();
cout<<sum<<endl;
}
return 0;
}
|