bfs搜索,x,y和船停的地方。
#include <iostream> #include <queue> #include <stack> #include <map> #include <set> #include <bitset> #include <cstdio> #include <algorithm> #include <cstring> #include <climits> #include <cstdlib> #include <cmath> #include <time.h> #define maxn 50005 #define maxm 300005 #define eps 1e-3 #define mod 9999677 #define INF 0x3f3f3f3f #define PI (acos(-1.0)) #define lowbit(x) (x&(-x)) #define mp make_pair #define ls o<<1 #define rs o<<1 | 1 #define lson o<<1, L, mid #define rson o<<1 | 1, mid+1, R #define pii pair<int, int> #pragma comment(linker, "/STACK:16777216") typedef long long LL; typedef unsigned long long ULL; using namespace std; LL qpow(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base;base=base*base;b/=2;}return res;} LL powmod(LL a, LL b){LL res=1,base=a;while(b){if(b%2)res=res*base%mod;base=base*base%mod;b/=2;}return res;} //head struct node { int x, y, t, u; node() {} node(int x, int y, int t, int u) : x(x), y(y), t(t), u(u) {} }; queue<node> q; int vis[2][205][205]; int n, nx, ny; void bfs() { int ans = -1; memset(vis, 0, sizeof vis); vis[0][nx][ny] = true; while(!q.empty()) { int x = q.front().x, y = q.front().y; int t = q.front().t, u = q.front().u; q.pop(); // printf("AAA %d %d %d\n", x, y ,u); int xx = nx - x, yy = ny - y; if(x == 0 && y == 0) { ans = t; break; } if(u == 0) { for(int i = 0; i <= n && i <= x; i++) for(int j = 0; i + j <= n && j <= y; j++) { if(i == 0 && j == 0) continue; if(i && j > i) break; if(x - i && y - j > x - i) continue; if(xx + i && (yy + j) > xx + i) continue; if(!vis[1][x-i][y-j]) vis[1][x-i][y-j] = true, q.push(node(x - i, y - j, t+1, 1)); } } else { for(int i = 0; i <= n && i <= xx; i++) for(int j = 0; i + j <= n && j <= yy; j++) { if(i == 0 && j == 0) continue; if(i && j > i) break; if(xx - i && yy - j > xx - i) continue; if(x + i && (y + j) > x + i) continue; if(!vis[0][x+i][y+j]) vis[0][x+i][y+j] = true, q.push(node(x + i, y + j, t+1, 0)); } } } printf("%d\n", ans); } void work() { if(nx && nx < ny) { printf("-1\n"); return; } while(!q.empty()) q.pop(); q.push(node(nx, ny, 0, 0)); bfs(); } int main() { while(scanf("%d%d%d", &nx, &ny, &n)!=EOF) { work(); } return 0; }