现给出两个和平棋盘, 问是否能经过K步操作将棋盘1转化为棋盘2
1<=n<=8, K未知
观察
..:
一道非常裸的搜索题, 外加一点一点记忆化的思想, 细节见代码
记忆话检查的办法收到了SRM628某题的启发, 使用了8进制表示法
记忆话检查的办法收到了SRM628某题的启发, 使用了8进制表示法
写出代码
..:
#include <bits/stdc++.h> using namespace std; typedef vector<int> vin; typedef map<int, int> mii; int n, f; mii v; vin g, t; inline void dodo() { int k=0, i; for (i=0; i<n; i++) k+=g[i]*pow(8, i); if (v[k]) return; v[k]=1; for (i=0; i<n; i++) if (g[i]!=t[i]) break; if (i==n) { f=1; return; } int t; for (int i=1; !f && i<n; i++) for (int j=0; !f && j<i; j++) if (g[j]>g[i]) { t=g[i], g[i]=g[j], g[j]=t; dodo(); t=g[i], g[i]=g[j], g[j]=t; } } class MovingRooksDiv2 { public: string move(vector <int> Y1, vector <int> Y2) { n=Y1.size(); g=Y1; t=Y2; dodo(); return f ? "Possible" : "Impossible"; } };