c++广搜法跳马问题(队列)

1043.跳马

时限:1000ms 内存限制:10000K  总时限:3000ms

描述 在国际象棋中,马的走法与中车象棋类似,即俗话说的“马走日”,下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置)。

《c++广搜法跳马问题(队列)》

现有一200*200大小的国际象棋棋盘,棋盘中仅有一个马,给定马的当前位置(S)和目标位置(T),求出马最少需要多少跳才能从当前位置到达目标位置。   输入 本题包含多个测例。输入数据的第一行有一个整数N(1<=N<=1000),表示测例的个数,接下来的每一行有四个以空格分隔的整数,分别表示马当前位置及目标位置的横、纵坐标C(x,y)和G(x,y)。坐标由1开始。   输出 对于每个测例,在单独的一行内输出一个整数,即马从当前位置跳到目标位置最少的跳数。   输入样例 2

1 1 2 1

1 5 5 1

  输出样例 3

4

#include<stdio.h>

#include<iostream>

#include<queue>

using namespace std;

int b1[201][201]={0},step[201][201];

int a,b,m,n;

int dire1[8]={1,1,2,2,-1,-1,-2,-2},dire2[8]={2,-2,1,-1,2,-2,1,-1};

int  search(int x,int y);

void init();

struct add

{

queue<int>q1;

queue<int>q2;

}add;

int main()

{

int sum,q,i,j;

scanf(“%d”,&q);

while(q)

{

scanf(“%d%d%d%d”,&a,&b,&m,&n);

init();

sum=search(a,b);

printf(“%d\n”,sum);

q–;

for(i=1;i<=200;i++)//每次输出完成后需将数组中元素重新赋值为0,避免影响下一次运算

{

for(j=1;j<=200;j++)

{

b1[i][j]=0;

step[i][j]=0;

}

}

while(!add.q1.empty())//清空队列元素

{

add.q1.pop();

}

while(!add.q2.empty())

{

add.q2.pop();

}

    }

return 0;

}

void init()

{

b1[a][b]=1;

add.q1.push(a);

add.q2.push(b);

step[a][b]=0;

}

int search(int x,int y)

{

int c,d;

while(1)

{

x=add.q1.front();

add.q1.pop();

y=add.q2.front();

add.q2.pop();

for(int i=0;i<8;i++)

{

c=x+dire1[i];

d=y+dire2[i];

if(c==m&&d==n)

{

return (step[x][y]+1);

}

if(c>200||c<1||d>200||d<1)continue;

if(b1[c][d]==0)

{

b1[c][d]=1;

add.q1.push(c);

add.q2.push(d);

step[c][d]=step[x][y]+1;

}

}

    }

return (-1);

}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/geshengtong/article/details/78468246
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞