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

 

posted @ 2021-01-18 23:47  狂奔的小学生  阅读(166)  评论(0编辑  收藏  举报