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;
}