题目链接:点击查看
第一次写DFS的文章,也是才开始做DFS的题,这道题花了我不少时间,第一遍是根据做的上一个DFS题poj的1088题的标答改出来的,因此有一些不必要的操作。然后,晚上想了想DFS的实现过程,用程序跑了一遍,发现跟我想的实现过程差不多。主要就是递归和遍历(可能吧)。删去了不必要的计步数组只用visit。另外还学到了如何简便的实现方向移动。
另外POJ好像不资瓷bits/stdc++.h这个头文件。
AC代码:
/*POJ 1979 Red and Black 再尝试*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
//定义
const int maxn = 30;
int n,m;
int visit[30][30];
char map[30][30];
int dx[] = {-1,1,0,0};
int dy[] = { 0,0,1,-1};
//是否为边界
bool judge(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m)
return true;
return false;
}
int dfs(int x,int y){
int ans = 0;
for(int i=0;i<4;i++){
int nextx = x + dx[i];
int nexty = y + dy[i];
if(visit[nextx][nexty]) continue; //已经访问
visit[nextx][nexty] = 1;
if(judge(nextx,nexty)&&map[nextx][nexty]=='.'){
int temp = dfs(nextx,nexty);
ans += temp + 1;
}
}
return ans;
}
int main(void){
cin>>m>>n;
int pi,pj;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
visit[i][j] = 0;
if(map[i][j]=='@'){
pi = i;
pj = j;
}
}
}
printf("%d\n",dfs(pi,pj)+1);
//查看访问情况
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",visit[i][j]);
}
printf("\n");
}*/
return 0;
}