迷宫问题
不过该算法得出的解法并不是最简解法,因为该算法是根据数组next的顺序来进行先后查找的,即先查找右边,再查找下边,再查找左边,最后查找上边。
下面是深度优先搜索基本模型。
void dfs(int step)
{
判断边界;
for (i=1;i<=n;i++)尝试每一种可能
{
dfs(step+1);
}
返回
}
BUG已改正,无解情况已增加。
#include<stdio.h>
#include<string.h>
#define m 5//地图大小
#define n 4
int count=0;
int flag[m][n],s[m*n][2],next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char map[m][n];
int dfs(int i,int j)
{
int i1,j1,k;
for (k=0;k<4;k++)
{
i1=i+next[k][0];
j1=j+next[k][1];
if (i1<0||i1>=m||j1<0||j1>=n)
continue;
if (map[i1][j1]=='E')
{
s[count][0]=i1;
s[count][1]=j1;
count++;
return 0;
}
if (map[i1][j1]=='0'&&flag[i1][j1]==0)
{
s[count][0]=i1;
s[count][1]=j1;
count++;
flag[i1][j1]=1;
if (dfs(i1,j1)==0)
return 0;
flag[i1][j1]=0;
s[count][0]=0;
s[count][1]=0;
count--;
}
}
return 1;
}
int main()
{
int i,j;
printf("请输入一个迷宫地图\n0代表可走路径\n1代表障碍物\nS代表起点\nE代表终点:\n");
for (i=0;i<m;i++)
gets(map[i]);
for (i=0;i<m;i++)
{
for (j=0;j<n;j++)
{
if (map[i][j]=='S')
{
s[count][0]=i;
s[count][1]=j;
count++;
dfs(i,j);
}
}
}
if (count==1)
printf("该地图无解");
else
{
printf("该地图的解法之一如下\n");
for (i=0;i<count;i++)
printf("%d %d\n",s[i][0],s[i][1]);
printf("总共走了%d步",count-1);
}
}