【BZOJ 1193】 [HNOI2006]馬步距離
阿新 • • 發佈:2018-04-04
black cnblogs 如果 ifdef namespace pro fde .com memset
(如果x或者y變成負數了,那麽直接取絕對值就好。因為下一步總是能跳回來的
(變成負數,肯定是0->-1了,那麽我們就把它改成往裏面跳就好了,那麽就是變成1了而不是-1,所以直接取絕對值是沒問題的。
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
原問題可以等價為兩個點。
然後其中一個點要移動到另外一個點。
那麽我們可以把左下角那個點(對稱總是可以得到一個點在左下角)放在原點的位置。
然後通過x坐標差和y坐標差。
獲取出來,另外一個點的相對位置。
然後問題就轉化成
從原點(0,0)出發,到達點(|xp-xs|,|yp-ys|)的問題了
設那個點為(x,y)
這個問題在大範圍內。
即當x>10或者y>10的時候。可以談心地解。
即直接讓他往(0,0)的方向貪心跳
直到x<10且y<10就好
(每次跳的時候,如果x>y那麽x-=2,y-=1,如果x<=y那麽y-=2,x-=1
(變成負數,肯定是0->-1了,那麽我們就把它改成往裏面跳就好了,那麽就是變成1了而不是-1,所以直接取絕對值是沒問題的。
【代碼】
#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const double pi = acos(-1);
const int dx[8] = {-1,-2,-2,-1,1,2,2,1};
const int dy[8] = {-2,-1,1,2,2,1,-1,-2};
const int N = 20;
const int INF = 0x3f3f3f3f;
int xp,yp,xs,ys,ans;
int dis[N+10][N+10];
queue<pair<int ,int> > dl;
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
scanf("%d%d%d%d",&xp,&yp,&xs,&ys);
xp = abs(xp-xs);
yp = abs(yp-ys);
while (xp > 10 || yp>10){
if (xp>yp){
xp-=2;
yp-=1;
}else {
yp-=2;
xp-=1;
}
xp = abs(xp);yp = abs(yp);
ans++;
}
dl.push(make_pair(0,0));
memset(dis,INF,sizeof dis);
dis[0][0] = 0;
while (!dl.empty()){
int x = dl.front().first,y = dl.front().second;
dl.pop();
for (int i = 0;i < 8;i++){
int tx = x+dx[i],ty = y + dy[i];
if (tx<-1 || ty<-1 || tx>11 || ty>11) continue;
if (dis[tx][ty]>dis[x][y]+1){
dis[tx][ty] = dis[x][y] + 1;
dl.push(make_pair(tx,ty));
}
}
}
printf("%d\n",ans+dis[xp][yp]);
return 0;
}
【BZOJ 1193】 [HNOI2006]馬步距離