洛谷P1747
这个题被坑麻了,题目居然不给棋盘的范围,评论区居然有人说棋盘是无限大的,我想说的是如果真是这样那么第9个点答案应该是2而不是3,这个棋盘绝对是有大小的。
#include<iostream>
#include<utility>
#include<queue>
#include<unordered_map>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
bool vis[1000][1000];
bool vis2[1000][1000];
//#define DEBUG
struct point{
int x,y,step;
};
int dx[12] = {1,1,-1,-1,2,2,-2,-2,2,2,-2,-2};
int dy[12] = {2,-2,2,-2,1,-1,1,-1,2,-2,2,-2};
queue<point> black;
queue<point> white;
void bfs1(){
while(!black.empty()){
point temp1 = black.front();
black.pop();
fi(i,0,11){
int p = temp1.x + dx[i];
int q = temp1.y + dy[i];
int step = temp1.step + 1;
if(p <= 0 || q <= 0 || p >= 1000 || q >= 1000 || vis[p][q]) continue;
vis[p][q] = true;
if(p == 1 && q == 1){
cout << step << endl;
return;
}
else{
black.push({p,q,step});
}
}
}
}
void bfs2(){
while(!white.empty()){
point temp1 = white.front();
white.pop();
fi(i,0,11){
int p = temp1.x + dx[i];
int q = temp1.y + dy[i];
int step = temp1.step + 1;
if(p <= 0 || q <= 0 || p >= 1000 || q >= 1000 || vis2[p][q]) continue;
vis2[p][q] = true;
if(p == 1 && q == 1){
cout << step << endl;
return;
}
else{
white.push({p,q,step});
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int x1,y1,x2,y2;
cin >> x1 >> y1 >> x2 >> y2;
black.push({x1,y1,0});
vis[x1][y1] = true;
bfs1();
white.push({x2,y2,0});
vis2[x2][y2] = true;
bfs2();
// cout << 0 << endl;
#ifdef DEBUG
//freopen(D:\in.txt,r,stdin);
#endif
return 0;
}