poj 1111(注意臨時變數的選取不要重複)
阿新 • • 發佈:2021-11-26
#include<iostream> #include<queue> #include<cstring> using namespace std; char data[25][25]; bool visit[25][25]; int r,c,a,b,result; struct Node{ int x,y; Node(int a,int b){ x = a; y = b; } }; const int dx[] = {-1,0,1},dy[] = {-1,0,1}; void bfs(){ memset(visit,false,sizeof visit); a--; b--; queue<Node>q; q.push(Node(a,b)); visit[a][b] = true; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ int x = a+dx[i]; int y = b+dy[j]; bool flag = false; if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue; if(x<0||x>=r){ flag = true; result++; } if(y<0||y>=c){ flag = true; result++; } if(!flag){ if(data[x][y]=='.'){ result++; } } } } while(!q.empty()){ int qx = q.front().x; int qy = q.front().y; q.pop(); for(int s=0;s<3;s++){ for(int t=0;t<3;t++){ if(s==1&&t==1)continue; int qx_s = qx+dx[s]; int qy_t = qy+dy[t]; if(qx_s<0||qx_s>=r||qy_t<0||qy_t>=c)continue; if(data[qx_s][qy_t]=='X'&&visit[qx_s][qy_t]==false){ q.push(Node(qx_s,qy_t)); visit[qx_s][qy_t] = true; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ int x = qx_s+dx[i]; int y = qy_t+dy[j]; bool flag = false; if((i==1&&j==1)||(dx[i]*dy[j]!=0))continue; if(x<0||x>=r){ flag = true; result++; } if(y<0||y>=c){ flag = true; result++; } if(!flag){ if(data[x][y]=='.'){ result++; } } } } } } } } } int main(){ while(scanf("%d%d%d%d",&r,&c,&a,&b)==4&&r){ for(int i=0;i<r;i++){ scanf("%s",data[i]); } result = 0; bfs(); printf("%d\n",result); } return 0; }