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; } }
原文地址:https://www.cnblogs.com/Warframe-Gauss/p/12247607.html
时间: 2024-10-16 18:31:09