0
点赞
收藏
分享

微信扫一扫

1257:Knight Moves

生态人 2022-04-29 阅读 76

1257:Knight Moves


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 7882     通过数: 4036

【题目描述】

输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入】

首先输入一个nn,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4≤L≤300)L(4≤L≤300);

第二行和第三行分别表示马的起始位置和目标位置(0..L−1)(0..L−1)。

【输出】

马移动的最小步数,起始位置和目标位置相同时输出00。

【输入样例】

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1

【输出样例】

5
28
0

 

#include <bits/stdc++.h>//Writed by Wangzhimin.Date:2022.4.29
int r,c;
int visited[305][305];
struct step1{
    int x;
    int y;
    int step;
    step1(int xx,int yy,int s):x(xx),y(yy),step(s){
    };
};
using namespace std;
int visit2[105];
int num=0;
int main()
{
    int k,i,j,n;
    int r1,c1,r2,c2;
    scanf("%d",&n); 
    for(num=0;num<n;num++){
    scanf("%d",&r);
    queue <step1> q;
    memset(visited,0,sizeof(visited));
    scanf("%d%d",&r1,&c1);
    scanf("%d%d",&r2,&c2);
    q.push(step1(r1,c1,0));
    visited[r1][c1]=1;
    while(!q.empty()){
        step1 s=q.front();
        //cout<<s.x<<s.y<<s.step<<endl;
        if(s.x==r2&&s.y==c2){
            visit2[num]=s.step;
            break;
                  }
        else{
            if(s.x-1>=0&&s.y+2<r&&visited[s.x-1][s.y+2]!=1){//下移右移 
                q.push(step1(s.x-1,s.y+2,s.step+1));
                visited[s.x-1][s.y+2]=1;
            }
            if(s.x+1<r&&s.y+2<r&&visited[s.x+1][s.y+2]!=1){//上移右移 
                q.push(step1(s.x+1,s.y+2,s.step+1));
                visited[s.x+1][s.y+2]=1;
            }
            if(s.y+1<r&&s.x+2<r&&visited[s.x+2][s.y+1]!=1){//右移上移 
                q.push(step1(s.x+2,s.y+1,s.step+1));
                visited[s.x+2][s.y+1]=1; 
            }
            if(s.y-1>=0&&s.x+2<r&&visited[s.x+2][s.y-1]!=1){//左移上移 
                q.push(step1(s.x+2,s.y-1,s.step+1));
                visited[s.x+2][s.y-1]=1; 
            }
            if(s.x-1>=0&&s.y-2>=0&&visited[s.x-1][s.y-2]!=1){//前移左移 
                q.push(step1(s.x-1,s.y-2,s.step+1));
                visited[s.x-1][s.y-2]=1;
            }
            if(s.x+1<r&&s.y-2>=0&&visited[s.x+1][s.y-2]!=1)//后移左移 
            {
                q.push(step1(s.x+1,s.y-2,s.step+1));
                visited[s.x+1][s.y-2]=1;
            }
            if(s.y+1<r&&s.x-2>=0&&visited[s.x-2][s.y+1]!=1){//右移上移 
                q.push(step1(s.x-2,s.y+1,s.step+1));
                visited[s.x-2][s.y+1]=1; 
            }
            if(s.y-1>=0&&s.x-2>=0&&visited[s.x-2][s.y-1]!=1){//左移上移 
                q.push(step1(s.x-2,s.y-1,s.step+1));
                visited[s.x-2][s.y-1]=1; 
            }
            
            q.pop();
    }
    }

}
for(i=0;i<num;i++)
cout<<visit2[i]<<endl;

    return 0;
}

举报

相关推荐

0 条评论