poj 1111(注意临时变量的选取不要重复)


#include
#include
#include
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--;
    queueq;
    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){
            scanf("%s",data[i]);
        }
        result = 0;
        bfs();
        printf("%d\n",result);
    }
    return 0;
}