最少步数
时间限制:3000 ms | 内存限制:65535 KB
难度:4
输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
2
3 1 5 7
3 1 6 7
样例输出
12
11
来源
上传者
描述
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
原理:运用递归的 暴力求解法
#include<stdio.h>
#include<stdlib.h>
#define max 100
#define n 9
int mg[n][n]=
{
{1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,1,0,1},
{1,0,0,1,1,0,0,0,1},
{1,0,1,0,1,1,0,1,1},
{1,0,0,0,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,1,0,0,1},
{1,1,0,1,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1},
};///////////////////////////////////////////创建迷宫
typedef struct
{
int i;
int j;
}box;/////////////////////////////////////////构造一个迷宫格子变量
typedef struct
{
box data[max];
int top;
}sqstack;/////////////////////////////////////创建一个栈用的
int x,y,num,flag;/////////////////////////////x,y为出口,num是最小步数
sqstack *s;
void mgpath(sqstack *&s,int i,int j);////////求解迷宫的函数
int main()
{
int i,j;
int t;
s=(sqstack *)malloc(sizeof(sqstack));
scanf("%d",&t);
while(t--)
{
flag=1;//////////////////////////////这个是用于后面重置num
s->top=-1;
scanf("%d%d%d%d",&i,&j,&x,&y);
mgpath(s,i,j);
printf("%d\n",num);
}
free(s);
return 0;
}
void mgpath(sqstack *&s,int i,int j)
{
if(i==x&&j==y)///////////////////////////格子是迷宫出口,就输出或计算最小步数num
{
if(flag)
{
num=s->top+1;
flag=0;
}
else if(num>s->top+1)
num=s->top+1;
/* printf("迷宫路径:\n");
for(i=0;i<=s->top;i++)
{
printf("(%d,%d) ",s->data[i].i,s->data[i].j);
if((i+1)%5==0)
printf("\n");
}
printf("\n");*/
}
else/////////////////////////////////不是迷宫出口,就进栈
{
s->top++;
s->data[s->top].i=i;
s->data[s->top].j=j;
mg[i][j]=-1;////////////////////标记走过
int i1,j1;//////////////////////下一步要走的格子坐标
for(int di=0;di<4;di++)
{
switch(di)
{
case 0:i1=i-1;j1=j; break;//上面
case 1:i1=i; j1=j+1;break;//右面
case 2:i1=i+1;j1=j; break;//下面
case 3:i1=i; j1=j-1; //左面
}
if(mg[i1][j1]==0) //可走,找下一个格子或判断此格子是否为出口
mgpath(s,i1,j1);
}
mg[s->data[s->top].i][s->data[s->top].j]=0;
s->top--;//四个方向走完,出栈,还原
}
}
/* 0 1 2 3 4 5 6 7 8
0{1,1,1,1,1,1,1,1,1},
1{1,0,0,1,0,0,1,0,1},
2{1,0,0,1,1,0,0,0,1},
3{1,0,1,0,1,1,0,1,1},
4{1,0,0,0,0,1,0,0,1},
5{1,1,0,1,0,1,0,0,1},
6{1,1,0,1,0,1,0,0,1},
7{1,1,0,1,0,0,0,0,1},
8{1,1,1,1,1,1,1,1,1},*/