一直没弄过DFS,每次看见这个自己就发憷,不过问题总要去克服,我就从ZOJ 1002开始喽~
经过自己的不懈努力,哈哈,嘿嘿,最终当然搞定这个啦!!
以前只是知道要记录搜索路径,但自己不知道到底怎么记录的。。。这次在网上搜了很多网友的代码,用dfs()的参数来记录的,觉得很不错~~
代码如下:
#include<stdio.h>
char map[4][4];
int n, num, max;
int check( int i, int j)
{
int k;
if(map[i][j] == '.')
{
for( k = j-1; k >= 0; k--) // 检查左边是否有碉堡
{
if( map[i][k] == '!')
return -1;
else if( map[i][k] == 'X')
break;
}
for( k = j+1; k < n; k++) // 检查右边是否有碉堡
{
if(map[i][k] == '!')
return -1;
else if( map[i][k] == 'X')
break;
}
for( k = i-1; k >= 0; k--) // 检查上边是否有碉堡
{
if( map[k][j] == '!')
return -1;
else if(map[k][j] == 'X')
break;
}
for( k = i+1; k < n; k++) // 检查下边是否有碉堡
{
if( map[k][j] == '!')
return -1;
else if(map[k][j] == 'X')
break;
}
return 1;
}
else
return 0;
}
void dfs(int key) // key 用来记录遍历数组的位置
{
if( key == n*n) // 递归结束的条件,总是忘记==!
{
max = max > num ? max : num;
return;
}
int i = key / n, j = key % n;
if(check(i,j) == 1)
{
num++;
map[i][j] = '!'; //标记为碉堡
dfs(key+1);
num--; // 还原,map[i][j] 的位置上不放置碉堡,从下一个位置找放碉堡的位置
map[i][j] = '.';
}
dfs(key+1); // 在下一个位置找放置碉堡的地方
}
int main()
{
int i, j;
while(scanf("%d", &n), n)
{
num = 0;
max = 0;
getchar();
for( i = 0; i < n; i++)
{
for( j = 0; j < n; j++)
map[i][j] = getchar();
getchar();
}
dfs(0);
printf("%d\n", max);
}
return 0;
}
本文通过ZOJ1002题目详细介绍了如何使用深度优先搜索(DFS)算法解决具体问题,并展示了如何利用DFS参数记录搜索路径,包括代码实现及关键步骤。
1150

被折叠的 条评论
为什么被折叠?



