根据汉诺塔的特点找到保存状态的最简方式。懂得hash的真谛才能ac qaq
首先从有序状态可以推出所有有解状态。大体是给每个不同的数字以不同的模,根据他们的位置分别哈希,加起来作为该种状态的哈希值。
这样可以根据这个哈希值取得各个数字的位置,得到当前情况。打表出各种移动的所需要的代价,即可转移到下一个状态
#include#include #include #include using namespace std;const int INF=0x3f3f3f3f;const int maxn=20000008;int mp7[maxn];int mp6[maxn>>1];int mp5[maxn>>2];int mp4[maxn>>3];int mp3[maxn>>4];int dp[10][10];void bfs(int ha,int mp[],int mod){ queue q; queue p; q.push(ha); p.push(0); mp[ha]=0; int i,a[10],b[10]; int x,y,sx,idx,nx,ny; while(!q.empty()) { x=q.front();q.pop(); y=p.front();p.pop(); sx=x;idx=0; for(i=1;i<=mod;i++) { a[i]=sx%mod; sx/=mod; } memset(b,INF,sizeof(b)); for(i=1;i<=mod;i++) if(b[a[i]+1]>i) b[a[i]+1]=i; b[0]=0;b[mod+1]=0; for(i=1;i<=mod;i++) { if(b[i]==INF) continue; if(b[i] =1;j--) ans=ans+(j-1)*md[i-j+1]; if(i==3) bfs(ans,mp3,mod); if(i==4) bfs(ans,mp4,mod); if(i==5) bfs(ans,mp5,mod); if(i==6) bfs(ans,mp6,mod); if(i==7) bfs(ans,mp7,mod); }}struct shit{ int x,y; bool operator<(const shit &a) const// "This blade never gets any lighter." { return x