您的位置:首页 > 其它

nyoj最少步数<水一下>

2016-04-06 18:27 337 查看
最少步数

时间限制:3000 ms | 内存限制:65535 KB

难度:4

描述

这有一个迷宫,有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

来源

[苗栋栋]原创

上传者

苗栋栋

daima :

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
int n,kx,ky,jx,jy;
int xa[4]={0,0,1,-1};
int ya[4]={1,-1,0,0};
struct node{
int xx,yy,bushu;
};
int map[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}
};
void disk()
{
queue<node> que;
bool fafe[10][10];
memset(fafe,true,sizeof(fafe));
node qian,now;
now.xx=kx;now.yy=ky;now.bushu=0;
que.push(now);
fafe[kx][ky]=false;
int ll=0;
while (!que.empty())
{
qian=que.front();
que.pop();
if (qian.xx==jx&&qian.yy==jy)
{
ll=qian.bushu;
break;
}
for (int i=0;i<4;i++)
{
int lx=qian.xx+xa[i];
int ly=qian.yy+ya[i];
if (lx<0||ly<0||lx==9||ly==9||map[lx][ly]==1||!fafe[lx][ly])
continue;
now.xx=lx;now.yy=ly;now.bushu=qian.bushu+1;
que.push(now);
fafe[lx][ly]=false;
}
}
printf("%d\n",ll);
}
int main()
{
scanf("%d",&n);
while (n--)
{

scanf("%d%d%d%d",&kx,&ky,&jx,&jy);
if (kx==jx&&ky==jy)
{
printf("0\n");
continue;
}//printf("    666\n");
disk();
//   printf("    666\n");

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: