南阳OJ 最少步数

最少步数

时间限制: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},*/

猜你喜欢

转载自blog.csdn.net/shenyulingyeye/article/details/81318508
今日推荐