HDU-1312题解(DFS)
Posted warframe-gauss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1312题解(DFS)相关的知识,希望对你有一定的参考价值。
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=0;y<hy;y++) { for(x=0;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=0;i<4;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[21][21]; int dirx[5]={0,1,-1,0}; int diry[5]={1,0,0,-1}; int i,j; int wx,hy,num; bool CHECK(int x,int y) { if(x<wx && x>=0 && y<hy && y>=0 ) return true; else return false; } void DFS(int dx,int dy) { room[dx][dy]=‘#‘; num++; for(int i=0;i<4;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==0 && hy==0) { break; } for(y=0;y<hy;y++) { for(x=0;x<wx;x++) { cin>>room[x][y]; if(room[x][y]==‘@‘) { dx=x; dy=y; } } } num=0; DFS(dx,dy); cout<<num<<endl; } }
以上是关于HDU-1312题解(DFS)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1312 Red and Black(bfs,dfs均可,个人倾向bfs)