题解 P1242 【新汉诺塔】

Starria的脑残粉

2017-06-15 11:32:16

Solution

既然没有c++的题解那我就写一发吧。。 思路其实很简单,优先保证较大的到达,(把其他较小的先移到另一个根柱子上。。处理一下细节就可以了,显然成立的是不会有冗余的操作 ```cpp #include<bits/stdc++.h> using namespace std; int n,x,f1[100],f2[100],ans,xx;//f1为盘子的当前状态,f2为终止状态 void dfs(int d,int x,int y,bool kk){//kk表示当前是否是处理这个盘子的时候 int z=1;while (x==z||z==y)z++; if (x==y){//不需要移动 if (d>1)dfs(d-1,f1[d-1],kk?f2[d-1]:y,kk&&true); return; } if (d>1)dfs(d-1,f1[d-1],z,false); cout<<"move "<<d<<" from "<<char(x+'A'-1)<<" to "<<char(y+'A'-1)<<endl,ans++; f1[d]=y; if (d>1)dfs(d-1,f1[d-1],kk?f2[d-1]:y,kk&&true);//当kk为真时大于等于当前的盘子已经处理完毕(处理剩余的盘子 } int main(){ ios::sync_with_stdio(false); cin>>n; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f1[xx]=1; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f1[xx]=2; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f1[xx]=3; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f2[xx]=1; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f2[xx]=2; cin>>x;for (int i=1;i<=x;i++)cin>>xx,f2[xx]=3; dfs(n,f1[n],f2[n],true); cout<<ans<<endl; } ```