数字和字符混合输入的时候,注意吃掉回车。用scanf("/n"); 由起始点深度优先搜索,八方向上相连的‘W’加入到栈中。其中由’W’向上下左右四个方向扩展的时候,碰到‘.’则perimeter++。 #include <iostream> using namespace std; int M,N,x,y,perimeter,index,my_stack[405][2]; char field[22][22]; int main() { freopen("d://1.txt","r",stdin); int tempx,tempy; while(scanf("%d%d%d%d",&M,&N,&x,&y)&&(M!=0)) { scanf("/n"); memset(field,'.',sizeof(field)); for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { scanf("%c",&field[i][j]); } scanf("/n"); } perimeter=0; my_stack[0][0]=x; my_stack[0][1]=y; index=1; field[x][y]='U'; while(index--) { tempx=my_stack[index][0]; tempy=my_stack[index][1]; for(int i=tempx-1;i<=tempx+1;i++) { for(int j=tempy-1;j<=tempy+1;j++) { if(field[i][j]=='X') { my_stack[index][0]=i; my_stack[index++][1]=j; field[i][j]='U'; } else if(field[i][j]=='.') { if((tempx-i)*(tempy-j)==0&&((tempx-i+tempy-j)!=0)) perimeter++; } } } } printf("%d/n",perimeter); } return 0; }