#include<stdio.h>
#define n 5//高
#define m 5//宽
int a[n+2][m+2];//包含边界
int min=99999999;
int flag[7][7]={0};
int step;
int way=0;
struct point
{
int x;
int y;
};
int main()
{
for(int i=0;i<=n+1;i++)
for(int j=0;j<=m+1;j++)
{
scanf("%d",&a[i][j]);
}
void DFS(int x,int y,int step);
/*
1 1 1 1 1 1 1
1 0 0 0 1 0 1
1 0 1 0 0 1 1
1 0 0 0 0 0 1
1 0 0 1 0 0 1
1 0 0 0 0 2 1
1 1 1 1 1 1 1
以1为边界
用for循环输入迷宫
在此处假设0为空白道路,1为障碍物 ,2为终点
*/
struct point start;
for(int i=0;i<=n+1;i++)
{for(int j=0;j<=m+1;j++)
{
printf("%5d",a[i][j]);
}
printf("\n");
}
scanf("%d %d",&start.x,&start.y);flag[start.x][start.y]=1;
//printf("%d %d",a[5][5],flag[5][5]);
DFS(start.x,start.y,0);
printf("%d %d",min,way);
return 0;
}
void DFS(int x,int y,int step)
{
if(x==5)
{
if(y==5)
{
if(step<min)
min=step;
way++;
return;
}
}
if(flag[x][y+1]==0&&a[x][y+1]!=1)
{
flag[x][y+1]=1;
DFS(x,y+1,step+1);
flag[x][y+1]=0;
}
if(flag[x+1][y]==0&&a[x+1][y]!=1)
{
flag[x+1][y]=1;
DFS(x+1,y,step+1);
flag[x+1][y]=0;
}
if(flag[x][y-1]==0&&a[x][y-1]!=1)
{
flag[x][y-1]=1;
DFS(x,y-1,step+1);
flag[x][y-1]=0;
}
if(flag[x-1][y]==0&&a[x-1][y]!=1)
{
flag[x-1][y]=1;
DFS(x-1,y,step+1);
flag[x-1][y]=0;
}
return;
}
也可以利用方向变量例如
way_x[4]={0,1,0,-1};
way_y[4]={1,0,-1,0};这样DFS里就不用这么长了。
寒假也⑧放弃卷嗷,写的俩题让提交的不一样,但方法一样的·,一个是最少步数一个是方法种类,可以根据自己的题目改,嘻嘻,互相监督:)