hdu 1312 C++
Posted HardyDragon_CC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1312 C++相关的知识,希望对你有一定的参考价值。
hdu 1312
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++的主要内容,如果未能解决你的问题,请参考以下文章