深度优先搜索
深度优先搜索 DFS
深度优先搜索的基本模型
void dfs(int step)
{
判断边界
尝试每一种可能 for(i=1;i<=n;i++)
{
继续下一步 dfs(step+1)
}
返回
}
例子:
-
全排列(DFS思想): 输出自然数 1 到 n所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。。 #include<stdio.h>
int a[10], book[10], n;
void dfs(int step)
{
int i;
if (step == n + 1)
{
for (i = 1; i <= n; i++)
printf("%d ", a[i]);
printf("\n");
return;
}
for (i = 1; i <= n; i++)
{
if (book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step + 1);
book[i] = 0;
}
}
return;
}
int main()
{
scanf_s("%d", &n);
dfs(1);
return 0;
}
上面的布局可以用序列 2 4 6 1 3 5 来描述,第 i 个数字表示在第 i 行的相应位置有一个棋子,如下:
行号 1 2 3 4 5 6
列号 2 4 6 1 3 5
这只是棋子放置的一个解。请编一个程序找出所有棋子放置的解。 并把它们以上面的序列方法输出,解按字典顺序排列。 请输所有的解。最后一行是解的总个数。
#include<stdio.h>
int n,cnt;
int lie[20];
int u[40];
int v[40];
int a[20];
void pr()
{
for (int i = 1; i <= n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
}
void dfs(int x)
{
if (x ==n+1 )
{
pr();
cnt++;
return;
}
for (int i = 1; i <= n; i++)
{
if (!lie[i] && !u[x - i + n] && !v[x + i])
{
a[x] = i;
lie[i] = 1;
u[x - i + n] = 1;
v[x + i] = 1;
dfs(x + 1);
lie[i] = 0;
u[x - i + n] = 0;
v[x + i] = 0;
}
}
return;
}
int main()
{
scanf_s("%d", &n);
dfs(1);
printf("%d", cnt);
return 0;
}
-
迷宫(DFS思想) 给定一个N*M方格的迷宫。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 *输入格式:*第一行输入N和M,N为行,M为列。接下来的n行m列为迷宫,0表示空地,1表示障碍物。最后一行输入起点坐标SX,SY,终点坐标FX,FY。 *输出格式:*给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。
#include<stdio.h>
int n, m, fx,fy,cnt;
int a[51][51], book[51][51];
void dfs(int x, int y, int step)
{
int xx[] = { 1,0,-1,0 };
int yy[] = { 0,-1,0,1 };
int tx, ty;
if (x == fx && y == fy)
{
cnt++;
return;
}
for (int k = 0; k <=4; k++)
{
int tx = xx[k] + x;
int ty = yy[k] + y;
if (tx >= 1 && tx <= n && ty >= 1 && ty <= m && !a[tx][ty] && !book[tx][ty])
{
book[tx][ty] = 1;
dfs(tx, ty,step+1);
book[tx][ty] = 0;
}
}
return;
}
int main()
{
int sx, sy;
scanf_s("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
for (int j =1; j <= m; j++)
{
scanf_s("%d", &a[i][j]);
}
}
scanf_s("%d%d%d%d", &sx, &sy, &fx, &fy);
book[sx][sx] = 1;
dfs(sx, sy, 0);
printf("%d",cnt);
return 0;
}
|