首页 > 试题广场 >

小红走象步

[编程题]小红走象步
  • 热度指数:194 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
众所周知,象棋中象走"田"字。假设象初始在(3,4)坐标,它一步可以走到(1,2)或(5,6)或(1,6)或(5,2)坐标。
但是如果象的象眼被堵了,那么就不能走过去。例如刚刚的例子,若(4,5)坐标有一个障碍,那么象则不能从(3,4)走到(5,6)。
若象踩的位置上有个兵,那么象可以把兵吃掉。但如果象眼被堵,那么就无法走到该处。
现在小红有一个 的棋盘,其中上面放置了 k 个兵。小红在 (x_0,y_0) 位置放置了一个象。小红想知道,从 (x_0,y_0) 走到 (x_t,y_t),至少要走多少步?

输入描述:
第一行输入两个正整数 nm,代表棋盘的大小。
第二行输入一个正整数 k ,代表兵的数量。
接下来的 k 行,每行输入两个正整数 x_i,y_i,用来表示第 i 个兵的坐标。
最后一行输入四个正整数 x_0,y_0,x_t,y_t,用来表示象的起始坐标和目的坐标。
保证所有坐标两两不同。





输出描述:
如果象无法从 (x_0,y_0) 走到 (x_t,y_t),则输出-1
否则输出从 (x_0,y_0) 走到 (x_t,y_t) 的最短步数。
示例1

输入

3 3
1
2 2
1 1 3 3

输出

-1

说明

象眼被堵,该象动弹不得。
示例2

输入

3 3
1
2 1
1 1 3 3

输出

1

说明

只需要一步则可从 (1,1) 走到 (3,3)。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
const int N=1005;
vector<vector<int>>mp(N,vector<int>(N,-1));
vector<vector<int>>dist(N,vector<int>(N,-1));

int dx[4]={-2,2,2,-2};
int dy[4]={2,2,-2,-2};
int n,m,k,start_x,start_y,end_x,end_y;
queue<PII>q;
void bfs(){
    q.push({start_x,start_y});
    dist[start_x][start_y]=0;
    while(!q.empty()){
        auto pos=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int x=pos.first+dx[i];
            int y=pos.second+dy[i];
            if(x<=0||x>n||y<=0||y>m)continue;//越界
            if(dist[x][y]!=-1)continue;//不走回头路
           int mid_x=(x+pos.first)/2;
           int mid_y=(y+pos.second)/2;
           if(mp[mid_x][mid_y]==1)continue;//象眼有兵
            q.push({x,y});//满足条件入队
            dist[x][y]=dist[pos.first][pos.second]+1;//步数加一

            if(x==end_x&&y==end_y){
                cout<<dist[x][y];
                return;
            }
        }
    }
    cout<<-1;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int xi,yi;
    cin>>n>>m>>k;
    for(int i=0;i<k;i++){
        cin>>xi>>yi;
        mp[xi][yi]=1;
    }
    cin>>start_x>>start_y>>end_x>>end_y;
    bfs();
}
个人觉得的重点:
1.需要知道象的走法规则,
2.在判断是否堵象眼是要注意是起始点和落点之间的中点,而不是单纯的落点加减一这样是不对的。
3.然后就是小兵的读入实际上就是判断象眼,其它的没有影响,不需要多想,因为距离数组可以实现减枝的效果所以不需要在地图上修改;
发表于 2026-03-08 14:58:36 回复(0)