您的位置:首页 > 其它

UVA572(Oil Deposits)(DFS)

2017-12-26 12:06 477 查看
题目链接

第一次做DFS的题目,还一次AC了,开心

#include<iostream>
using namespace std;
#define MAXN 105
char map[MAXN][MAXN];
int m,n;
int dir[8][2] = { { 0,-1 },{ 0,1 },{ 1,0 },{ -1,0 },{-1,-1},{-1,1},{1,-1},{1,1} };//因为题目意思是斜着也算连通,所以定义八个方向
void dfs(int si, int sj)
{
if (si<0 || si>m || sj<0 || sj>n)return;
for (int i = 0; i < 8; i++)
{
if (map[si + dir[i][0]][sj + dir[i][1]] == '@')
{
map[si + dir[i][0]][sj + dir[i][1]] ='*';//做过的地方就标记不能走
dfs(si + dir[i][0], sj + dir[i][1]);//递归把连通的地方都走一遍
}
}
return ;
}

int main()
{
while (cin >> m >> n&&n&&m)
{
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> map[i][j];
int num = 0;  //记录连通分量
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (map[i][j] == '@') { dfs(i, j); num++; }
cout << num << endl;
}
}


这是最简单的DFS题目,我们老师和我们说DFS最精彩的地方应该是剪枝,因为DFS是要去走完整幅地图,效率还是很低的,要提高效率,就要适当剪枝,避免一些多余的步子,当然也不可过度剪枝,所以怎么剪枝还是要多想。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dfs uva 地图