问题标题: 酷町堂:5290 骑士 //样例卡住了……

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

编写一个程序,计算一个骑士从棋盘上的一个格子到另一个格子所需的最小步数。骑士一步可以移动到的位置由下图给出。
image.png

输入描述 Input Description

第一行给出骑士的数量 nn。
在接下来的 3n 行中,每 3 行描述了一个骑士。其中,

  • 第一行一个整数 LL 表示棋盘的大小,整个棋盘大小为 L*L;
  • 第二行和第三行分别包含一对整数 (x,y),表示骑士的起始点和终点。假设对于每一个骑士,起始点和终点均合理。

输出描述 Output Description

对每一个骑士,输出一行一个整数表示需要移动的最小步数。如果起始点和终点相同,则输出 0。

 

样例直接卡住qwq

#include<iostream>
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
int t,n,sx,sy,ex,ey,ans;
int dir[9][2]={{0},{1,2},{1,-2},{2,1},{2,-1},{-1,2},{-1,-2},{-2,1},{-2,-1}};
bool vis[305][305];
void dfs(int x,int y,int sum){
    if(sum>=ans) return ;
    if(x==ex&&y==ey){
        ans=min(ans,sum);
        return ;
    }
    for(int i=1;i<=8;i++){
        int dx=x+dir[i][0],dy=y+dir[i][1];
        if(dx>=0&&dx<n&&dy>=0&&dy<n&&!vis[dx][dy]){
            vis[dx][dy]=true;
            dfs(dx,dy,sum+1);
            vis[dx][dy]=false;
        }
    }
}
int main(){
    cin>>t;
    while(t--){
        memset(vis,0,sizeof(vis));
        ans=0x3f3f3f3f;
        scanf("%d%d%d%d%d",&n,&sx,&sy,&ex,&ey);
        dfs(sx,sy,0);
        printf("%d\n",ans);
    }
    return 0;
}

求优化


0
已采纳
张帆
张帆
中级天翼
中级天翼

求最短路径需要用广搜。

张帆在2021-02-22 18:29:41追加了内容

而且广搜你必须不能回溯,

要是回溯了你这题就得凉!!!

 

 

而且广搜你必须不能回溯,

要是回溯了你这题就得凉!!!

 

 

而且广搜你必须不能回溯,

要是回溯了你这题就得凉!!!

张帆在2021-02-22 19:00:41追加了内容

你这个体用广搜数据范围我都嫌小。

张帆在2021-02-23 16:54:22追加了内容

和深搜递推式一模一样,只是不要回溯。

@汪恺恒 

 

0
我要回答