HDU-1312题解(DFS)
2024-08-31 20:13:46
HDU-1312-DFS
Written by Void-Walker 2020-02-01 09:09:25
1.题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312
2.题目大意:
有一个矩形房间,房间里有红砖块(‘#’)和黑砖块(‘.’)组成。现在有一个人站在一个@上面,他只能走黑色方块,现在问他最多能经过多少黑色方块。(他的初始位置也算)
3.题目思路:
这道题是一个非常经典的深度优先搜索。我们从他的初始位置开始搜索:
for(y=;y<hy;y++)
{
for(x=;x<wx;x++)
{
cin>>room[x][y];
if(room[x][y]=='@')
{
dx=x;
dy=y;
}
}
}
注意,认真读题,我们输入的两个尺寸参数第一个是数列,第二个才是横行,输入的时候要小心。之后,我们获得了初始位置就可以开始DFS了。
void DFS(int dx,int dy)
{
room[dx][dy]='#';
num++;
for(int i=;i<;i++)
{
int newx=dx+dirx[i];
int newy=dy+diry[i];
if(CHECK(newx,newy) && room[newx][newy]=='.')
{
DFS(newx,newy);
}
}
}
我们采用了一种非常巧妙的方法,每次搜索到一个点的时候,将这个点统一标记为红点,避免重复搜索。
这里的DFS非常经典,不包含其他拐弯抹角的地方,所以思想难度相对简单。
最后给出完整的代码:
#include<bits/stdc++.h>
using namespace std;
char room[][];
int dirx[]={,,-,};
int diry[]={,,,-};
int i,j;
int wx,hy,num;
bool CHECK(int x,int y)
{
if(x<wx && x>= && y<hy && y>= ) return true;
else return false;
}
void DFS(int dx,int dy)
{
room[dx][dy]='#';
num++;
for(int i=;i<;i++)
{
int newx=dx+dirx[i];
int newy=dy+diry[i];
if(CHECK(newx,newy) && room[newx][newy]=='.')
{
DFS(newx,newy);
}
}
}
int main()
{
int x,y,dx,dy;
while(cin>>wx>>hy)
{
if(wx== && hy==)
{
break;
}
for(y=;y<hy;y++)
{
for(x=;x<wx;x++)
{
cin>>room[x][y];
if(room[x][y]=='@')
{
dx=x;
dy=y;
}
}
}
num=;
DFS(dx,dy);
cout<<num<<endl;
}
}
最新文章
- (一)GPIO 编程实验 LED 流水灯控制
- Router的创建者——RouteBuilder
- 解决并发情况下库存减为负数问题--update2016.04.24
- Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新
- PDA手持终端实现零售行业商场和超市仓储管理和销售开单自动化和系统化
- Linux shell实现Mysql异地备份数据库
- C#类型的转换:Converter<;TInput, TOutput>; 委托的使用
- linux系统清空文件内容
- [Angular 2] 9. Replace ng-modle with #ref &; events
- redo、undo、binlog的区别
- hbase学习笔记-----REST客户端
- ie6背景透明的设置方法 ie6背景颜色透明和png图像透明解决方法
- web及H5 的链接测试
- JavaScript高级(01)
- java常用工具(jps等)说明
- SSH整合方案一(带有hibernate.cfg.xml)
- Apache ab 压力并发测试工具
- WPF中的路由事件(转)
- linux命令2—常见linux命令
- POJ1144 Network(割点)题解