最少步数

最少步数
时间限制: 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);
}
}

posted @ 2017-02-26 09:19  飞起的小田  阅读(282)  评论(0编辑  收藏  举报