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; }
|