hdu 1312 C++

Posted HardyDragon_CC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1312 C++相关的知识,希望对你有一定的参考价值。

hdu 1312 题目

• 一个长方形的房间,铺着方砖,每块砖是 #或黑点. 。
• 一个人站在黑砖上,可以按上、下、左、右方向移动到相邻的砖。
• 他不能在#上移动,他只能在黑砖上移动。
• 起点是@,要求:遍历所有黑点。

BFS

  • BFS 使用队列辅助实现;节点元素包含了位置的x,y。
  • 将元素进队时将元素标记为已经访问,下次搜索时跳过。
  • 返回的是可以走的位置数目。
//ECUST luoyongjun
#include<bits/stdc++.h>

using namespace std;
char room[23][23];
int dir[4][2] = {
        {-1, 0},  //向左。左上角坐标是(0, 0)
        {0,  -1},  //向上
        {1,  0},   //向右
        {0,  1}    //向下
};
int Wx, Hy, num;                 //Wx行,Hy列。用num统计可走的位置有多少
#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy) //是否在room里
struct node {
    int x, y;
};

void BFS(int dx, int dy) {
    num = 1;                         //起点也包含在砖块内
    queue<node> q;              //队列中放坐标点
    node start, next;
    start.x = dx;
    start.y = dy;
    q.push(start);
    while (!q.empty()) {
        start = q.front();
        q.pop();
        cout << "out" << start.x << start.y << endl;    //打印出队列情况,进行验证
        for (int i = 0; i < 4; i++) { //按左、上、右、下,4个方向顺时针逐一搜索
            next.x = start.x + dir[i][0];
            next.y = start.y + dir[i][1];
            if (CHECK(next.x, next.y) && room[next.x][next.y] == '.') {
                room[next.x][next.y] = '#';           //进队之后,标记为已经处理过
                num++;
                q.push(next);
            }
        }
    }
}

int main() {
    int x, y, dx, dy;
    while (cin >> Wx >> Hy) {              //Wx行,Hy列
        if (Wx == 0 && Hy == 0)             //结束
            break;
        for (x = 0; x < Wx; x++) {         //有Hy列
            for (y = 0; y < Hy; y++) {     //一次读入一行
                cin >> room[x][y];
                if (room[x][y] == '@') {     //读入起点
                    dx = x;
                    dy = y;
                }
            }
        }
        num = 0;
        BFS(dx, dy);
        cout << num << endl;
    }
    return 0;
}

output

4 5
. . . . #
. . . . .
# @ . . .
. # . . #
out21
out11
out22
out01
out10
out12
out32
out23
out00
out02
out13
out33
out24
out03
out14
15

DFS

  • DFS使用递归实现,递归的结束条件就是当前元素的四个方向都已经访问过了。
  • 方向数组可以一维实现
int dir[5] = {-1, 0, 1, 0, -1};

........
int newx = dx + dir[i];
int newy = dy + dir[i+1];
//ECUST luoyongjun
#include<bits/stdc++.h>

using namespace std;
char room[23][23];
int dir[4][2] = {
        {-1, 0}, // 向左
        {0,  1}, // 向下
        {1,  0}, // 向右
        {0,  -1} // 向上
};

/*
{-1,0,1,0,-1}
{-1, 0},  //向左。左上角坐标是(0, 0)
{0,  -1},  //向上
{1,  0},   //向右
{0,  1}    //向下
 */
int Wx, Hy, num;                 //Wx行,Hy列。用num统计可走的位置有多少
#define CHECK(x, y) (x<Wx && x>=0 && y >=0 && y<Hy) //是否在room里
struct node {
    int x, y;
};

void DFS(int dx, int dy) {
    room[dx][dy] = '#';                 //标记这个位置,表示已经走过
    cout << "walk:" << dx << dy << endl; //在此处打印走过的位置,验证是否符合
    num++;
    for (int i = 0; i < 4; i++) {      //左、上、右、下,4个方向顺时针深搜
        int newx = dx + dir[i][0];
        int newy = dy + dir[i][1];
        if (CHECK(newx, newy) && room[newx][newy] == '.') {
            DFS(newx, newy);
            cout << "    back:" << dx << dy << endl;
            //在此处打印回退的点的坐标,观察深搜到底后,回退的情况
            //例如到达最后的15这个位置后,会一直退到起点
            //即打印出14-11-10-9-8-7-6-5-4-3-2-1。这也是递归程序返回的过程
        }
    }
}

int main() {
    int x, y, dx, dy;
    while (cin >> Wx >> Hy) {              //Wx行,Hy列
        if (Wx == 0 && Hy == 0)             //结束
            break;
        for (x = 0; x < Wx; x++) {         //有Hy列
            for (y = 0; y < Hy; y++) {     //一次读入一行
                cin >> room[x][y];
                if (room[x][y] == '@') {     //读入起点
                    dx = x;
                    dy = y;
                }
            }
        }
        num = 0;
        DFS(dx, dy);
        cout << num << endl;
    }
    return 0;
}

output

4 5
. . . . #
. . . . .
# @ . . .
. # . . #
walk:21
walk:11
walk:01
walk:02
walk:03
walk:13
walk:14
walk:24
walk:23
walk:33
walk:32
walk:22
walk:12
    back:22
    back:32
    back:33
    back:23
    back:24
    back:14
    back:13
    back:03
    back:02
    back:01
walk:00
walk:10
    back:00
    back:01
    back:11
    back:21
15
0 0

以上是关于hdu 1312 C++的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1312 C++

hdu 1312 C++

HDU-1312题解(DFS)

HDU 1312(DFS_C题)解题报告

HDU1312-DFS

HDU 1312 Red and Black (dfs)