POJ 1979

Red and Black

Posted by clever on April 26, 2021

Red and Black(Accept rate:51%)

Time Limit: 1000MS

Memory Limit: 30000K

http://poj.org/problem?id=1979

解答思路:
使用深度优先搜索即可

解答代码如下:

#include <iostream>
#include <cstring>
using namespace std;

#define MAX_W 21
#define MAX_H 21
char map[MAX_H][MAX_W];//全地图标记
short used[MAX_H][MAX_W] = {0};//访问记录,0为未访问,1为访问
int black_count = 0;//黑色地砖数量记录

//深度优先搜索
void dfs(int Hs, int Ws, int H, int W){
    //越界检测
    if((Hs<1)||(Hs>H)||(Ws<1)||(Ws>W))
    {
        return;
    }
    //若地图该点未访问则执行,否则跳过
    if(!used[Hs][Ws])
    {
        used[Hs][Ws] = 1;//访问标记更新为已访问
        //为黑砖则执行
        if((map[Hs][Ws] == '.')||(map[Hs][Ws] == '@'))
        {
            black_count++;//黑砖记录+1
            dfs(Hs - 1, Ws, H, W);//往上看看
            dfs(Hs + 1, Ws, H, W);//往下看看
            dfs(Hs, Ws - 1, H, W);//往左看看
            dfs(Hs, Ws + 1, H, W);//往右看看
        }
        else
            return;
    }
    else
        return;
}

int main()
{
    int W, H;//当前地图宽与高
    int Ws = 0, Hs = 0;//当前位置
    cin >> W >> H;//输入宽度与高度
    while((W !=0)&&(H != 0))
    {
        //导入地图
        for(int i = 1; i <= H;i++)
        {
            for(int j = 1; j <= W;j++)
            {
                char tmp;
                cin >> tmp;//字符输入
                while(tmp == '\n')
                    cin >> tmp;//若为'\n'则跳过
                if(tmp == '@')//若为'@'则更新起点
                {
                    Hs = i;
                    Ws = j;
                }
                map[i][j] = tmp;//将字符导入地图
            }
        }
        black_count = 0;//黑砖起始为0
        memset(used, 0, sizeof(used));//地图访问记录清零
        dfs(Hs, Ws, H, W);//从起点开始深度搜索
        cout << black_count << endl;//输出黑砖数
        cin >> W >> H;//输入宽度与高度,若其一为0则结束
    }
    return 0;
}