【DFS】hdu 1312 Red and Black
题目描述:
http://acm.hdu.edu.cn/showproblem.php?pid=1312
中文大意:
一个长方形的房间,铺着方砖,每块方砖被标记为 # 或黑点. 。
一个人站在起点 @ ,可以上、下、左、右移动,但只能移动到标记为黑点的方砖上,不能移动到标记为 # 的方砖上。
要求:遍历尽可能多的黑点。
思路:
(1)将起点 s 标记为不可再被访问;
(2)如果下一步有多种选择,则任选一个方向进行移动,并将新位置标记为不可再被访问,否则回退到前一步;
(3)若新位置为起点,并且无路可走,则过程结束,否则继续(2)。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
};
int dir[4][2] = {
{0, -1}, //上
{1, 0}, //右
{0, 1}, //下
{-1, 0} //左
};
int w,h;
int num;
char** room;
bool check(node tem)
{
if(tem.x>=0&&tem.x<w&&tem.y>=0&&tem.y<h)
{
return true;
}
return false;
}
void DFS(int dx, int dy)
{
node next;
//尝试四个方向
for(int i=0;i<4;i++)
{
next.x = dx + dir[i][0];
next.y = dy + dir[i][1];
if(check(next)&&room[next.y][next.x]=='.')
{
room[next.y][next.x] = '#';
num++;
DFS(next.x, next.y);
}
}
}
int main()
{
while(scanf("%d%d", &w, &h)&&(w!=0&&h!=0))
{
num = 1;
int dx, dy;
room = new char*[h];
for(int i=0;i<h;i++)
{
room[i] = new char[w];
scanf("%s", room[i]);
for(int j=0;j<w;j++)
{
if(room[i][j] == '@')
{
dx = j;
dy = i;
break;
}
}
}
DFS(dx, dy);
printf("%d\n", num);
}
}