最少步数
Posted 飞起的小田
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最少步数相关的知识,希望对你有一定的参考价值。
最少步数
时间限制: 3000ms内存限制: 128000KB64位整型: Java 类名:
上一题 提交 运行结果 统计 讨论版 下一题
题目描述
这有一个迷宫,有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)。)
输入
第一行输入一个整数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
可以说是前面两个的升级版不一样的就是
前面两个是把每一次递归是的值变为不符合提议的
而显然这个题目不行,因为这是一个给定的地图
所以要想寻找就必须新定义一个规模和地图一样的数组
每次只变该数组,地图不做变换
再记录步数,依次留下最少的步数,
留到最后的,就是最少的步数
#include<stdio.h>
int f[4][2]={0,-1,-1,0,0,1,1,0};
int x1,y1,x2,y2,sum;
int m[9][9]={
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,
},a[9][9]; //定义一个值可以变换的数组
void dfs(int x,int y,int num)
{
if(x<0||y<0||x>8||y>8||a[x][y]||m[x][y]||num>=sum) //这是重点,抛弃 越界的,不能走的,和步数比上一个大的
{
return ;
}
if(x==x2&&y==y2)
{
sum=num;
return ;
}
a[x][y]=1; //新数组的每个值都是0,递归依次把它变成1
for(int i=0;i<4;i++)
{
int ex=x+f[i][0],ey=y+f[i][1];
dfs(ex,ey,num+1);
}
a[x][y]=0; //递归结束之后,把新数组中刚刚给他的值初始化,给他变回来。
}
int main()
{
int T;
sum=1000;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
dfs(x1,y1,0);
printf("%d\n",sum);
}
}
以上是关于最少步数的主要内容,如果未能解决你的问题,请参考以下文章