编辑代码

//矩形房间内男子"@"表示站在黑砖上"."表示,可以向四个相邻方向移动
//但不能是红砖“#”表示,计算其能经过的黑砖数
//输入第一行是俩正整数W和H,分别是房间行数和列数,然后下面给字符

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
const int maxn =25,maxm = 25;

int n,m,ans;
string map[maxn];   //当前瓷砖图
bool visited[maxn][maxm];   //访问标志

void search(int row, int col){
    if(row<0||row>n||col<0||col>m||map[row][col]=='#'||visited[row][col])
        return; //若当前瓷砖在地图外或不可通行或已经访问过,则回溯
    visited[row][col] = true;   //设置当前瓷砖访问标志
    ++ans;  //累计经过的瓷砖数
    search(row-1,col);
    search(row+1,col);
    search(row,col-1);
    search(row,col+1);
}

int main() {
    cin >> m >> n;
    while(n||m){
        int row,col;
        for(int i=0;i<n;i++){
            cin>>map[i];
            for(int j=0;j<m;j++)
                if(map[i][j]=='@'){ //记录男子所在位值
                    row = i;
                    col = j;
                }
        }
        memset(visited,false,sizeof(visited));
        ans=0;
        search(row,col);
        cout << ans << endl;
        cin >> m >> n;
    }
	return 0;
}