標籤:
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=3766
給你一個x ,y 求出從(0,0)位置到達需要的最小步數每次只能走日型;
為暴力bfs得到的答案;可以看一下;
/**首先,xy的大小排序和轉化為都是正數步數不變應該懂吧。y=2*x這種情況直接就是(x+y)/3步。如果y<2*x但是(x+y)%3==0的話,那麼我們可以通過控制(1,2),(2,1)兩種跳法的次數達到...總數必然是(x+y)/3,然後xy的和對3取餘是1的話,我們是不是必然可以在(x+y-1)/3步的時候跳到(x,y-1)這個點,但是不能一步跳到(x,y),回撤兩步到(x-4,y-5)這個點,我們可以用三步跳到(x,y),那麼就是原先的步數+1。餘數為2,就是先跳到(x-1,y-1)這個地方,我們知道(0,0)到(1,1)只需要兩步,那麼(x-1,y-1)到(x,y)也就是原先步數+2.然後考慮y>2*x,先把(0,1)的情況特殊處理一下。接著我們可以用x步跳到(x,y),那麼原問題就轉化為(0,0)到(0,y-2*x)。當y-2*x是4的倍數的話我們可以直接(1,2)(-1,2)這個跳可以在(y-2*x)/2步到達。餘數為1,就是(0,0)到(0,1)的問題,但是這個需要三步不是最優的,我們後撤兩步變為(0,0)到(0,5),我們可以三步達到,那麼就是原先的步數加上1就是解。餘數為2,我們可以分別跳一次(2,1)(-2,1)到達。餘數為3,轉化為(0,0)到(0,3)的問題我們可以(-1,2)(1,1)(0,3)三步到達。以上就是全部情況,o(╯□╰)o,在紙上畫畫,應該所有在這這幾類範圍內。**/#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<math.h>using namespace std;#define N 20100int main(){ int x, y, ans; char s[110]; while(scanf("%s", s), strcmp(s, "END")) { sscanf(s, "%d", &x); scanf("%d", &y); x=abs(x); y=abs(y); if(x>y)swap(x, y); if(y==x*2) { printf("%d\n", (x+y)/3); continue; } if(y<=2*x) { if(x==1&&y==1) ans = 2; else if(x==2&&y==2) ans = 4; else ans = (x+y)/3+(x+y)%3; } else { ans=x; int c=(y-2*x)%4; ans+=c; ans+=(y-2*x-c)/2; if(y==1&&x==0) ans=3; } printf("%d\n",ans); } return 0;}
Knight's Trip---hdu3766(馬走日求最小走的步數)