题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312
题目大意:点是路,#是墙,输出从起始位置能走多少步
题解:dfs函数两个参数x,y记录当前坐标。从起始位置开始深搜,如果当前位置是‘#’则不进行下一步搜索,如果是 。 则把sum+1,并且将该位置 置为 ‘#’ 进行下一步深搜(搜索上下左右的坐标点)
AC代码:
#include <iostream>
#include"math.h"
#include"string.h"
#include"algorithm"
using namespace std;
int sum = 0;
char map[25][25] = {'#'};
int w,h;
int startx,starty; void dfs(int x,int y){if(map[x][y] == '#') return;else{map[x][y] = '#';sum++;}dfs(x+1,y);dfs(x-1,y);dfs(x,y+1);dfs(x,y-1);
}int main(int argc, char** argv) { while(cin>>w>>h){if(w == h && w == 0) break;memset(map,'#',625);sum = 0;for(int i = 1;i<=h;i++)for(int j = 1;j<=w;j++) {cin>>map[i][j];if(map[i][j] == '@'){startx = i;starty = j;map[i][j] = '.';}}dfs(startx,starty);cout<<sum<<endl;}return 0;
}
小结:很普通的一道dfs题目 技巧点在于讲边界初始化为 墙(‘#’)这样就不用额外做边界判断。dfs函数的要点在于将走过的路堵死(置为‘#’)