1. 程式人生 > >HDU 1312(DFS_C題)解題報告

HDU 1312(DFS_C題)解題報告

spa close .cn algorithm -s for pla sin bit

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1312

-----------------------------------------------------------------------------------

題意:根據地圖,問可以到達多少地方.‘@‘為起點, ‘ . ‘為路,可以到達, ‘ # ‘為墻,不能通過.

思路:DFS,按照一定方式搜索標記。

代碼:

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include
<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0
); const double eps = 1e-6; const int MAXN =20+5; int H; int W; char road[MAXN][MAXN]; int flag[MAXN][MAXN]; int ans =0; void dfs(int i,int j){ if(road[i][j+1]==.&&flag[i][j+1]==0){ ans++; flag[i][j+1]=1; dfs(i,j+1); } if(road[i][j-1]==.&&flag[i][j-1
]==0){ ans++; flag[i][j-1]=1; dfs(i,j-1); } if(road[i+1][j]==.&&flag[i+1][j]==0){ ans++; flag[i+1][j]=1; dfs(i+1,j); } if(road[i-1][j]==.&&flag[i-1][j]==0){ ans++; flag[i-1][j]=1; dfs(i-1,j); } } int main(void){ while(~scanf("%d %d",&W,&H)&&(W!=0&&H!=0)){ ans= 0; for(int i=0;i<MAXN;i++){ for(int j=0;j<MAXN;j++){ road[i][j]=#; flag[i][j]=0; } } for(int i=0;i<H;i++){ scanf("%s",&road[i]); //printf("road:%s\n",road[i]); } int inx =0; int iny =0; for(int i=0;i<H;i++){ for(int j=0;j<W;j++){ if(road[i][j]==@){ ans++; inx =i; iny =j; flag[i][j]=1; //printf("%d %d\n",inx,iny); } } } dfs(inx,iny); printf("%d\n",ans); } return 0; }
View Code

HDU 1312(DFS_C題)解題報告