但是如果象的象眼被堵了,那么就不能走过去。例如刚刚的例子,若(4,5)坐标有一个障碍,那么象则不能从(3,4)走到(5,6)。
若象踩的位置上有个兵,那么象可以把兵吃掉。但如果象眼被堵,那么就无法走到该处。
现在小红有一个
第一行输入两个正整数和
,代表棋盘的大小。
第二行输入一个正整数,代表兵的数量。
接下来的行,每行输入两个正整数
,用来表示第
个兵的坐标。
最后一行输入四个正整数,用来表示象的起始坐标和目的坐标。
保证所有坐标两两不同。
如果象无法从走到
,则输出
。
否则输出从走到
的最短步数。
3 3 1 2 2 1 1 3 3
-1
象眼被堵,该象动弹不得。
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();
}