【题目大意】
有许多木块, 叠放时, 必须正着叠放, 如图1, 左边两块为合法叠放, 右边为不合法叠放.
图1
一个方块被称为稳定的, 当且仅当其放在最底层, 或其正下方有方块且下方的这个方块的四周都有方块. 叠放必须保证所有方块都稳定. 如图2, 左边3个叠放为合法叠放, 右边2个叠放为不合法叠放.
给定一个n,求能叠出的最高稳定建筑的高度
n<&#61;
【解题】考虑每一种高度&#xff0c;至少需要多少个方块&#xff0c;我们计算出这些值&#xff0c;随便维护一下就好了呀qwq
#include
#include
#include
using namespace std;
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
long long f,sum;
int n;
int main(){FO(block);scanf("%d",&n);f&#61;sum&#61;1;if(sum>&#61;n){puts("1");return 0;} for(int i&#61;2;;i&#43;&#43;){f&#61;f&#43;(i-1)*4;sum&#61;sum&#43;f;if(sum>&#61;n){cout<
}
T2 hanoi
【题目大意】
汉诺塔游戏众所皆知, 现在制定一个如下新的汉诺塔游戏规则:
共ABC三柱, 起初所有的盘子按从上到下从小到大的顺序排列在A柱, 移动规则依然是只能移动最顶端的盘子, 且一个盘子只能放在更大的盘子上方. 现增加一个规则, 同一个盘子不能被连续移动两次. 现有序列{AB, AC, BA, BC, CA, CB}(AB即表示将A的最上方的盘子移到B)的任一排序, 每次移动必须是在该序列中找到最早的一个合法的操作, 并移动. .(全部移动到BC任意一个柱子上即视为游戏结束.)
第一行输入一个整数n(n<&#61;20)&#xff0c;第二行输入一个操作序列&#xff0c;形同AB, AC, BA, BC, CA, CB
求游戏结束时所用操作数
【解题】
由于第二行的输入只有 6!种 &#xff0c;可以大胆猜测所有n对于这6!种操作序列的答案是有规律的&#xff0c;发现n&#61;3的时候答案只有三种&#xff0c;那么我们对于操作序列暴力跑一下n&#61;3的情况&#xff0c;判断这个操作序列的答案属于哪一种&#xff0c;直接计算即可
#include
#include
#include
#include
using namespace std;
#define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
char mov[7][2];
typedef long long ll;
ll cnt;bool ok;int n;
int top[3],qu[3][23333];
void dfs(int lst,int dep){if(dep>&#61;cnt)return;if(!top[0]&&(!top[1]||!top[2])){ok&#61;1;return;}for(int i&#61;0;i<6;i&#43;&#43;){int a&#61;mov[i][0]-&#39;A&#39;,b&#61;mov[i][1]-&#39;A&#39;;if(!top[a]||a&#61;&#61;lst) continue;int t&#61;qu[a][top[a]];if(top[b]&&t>qu[b][top[b]]) continue;--top[a];qu[b][&#43;&#43;top[b]]&#61;t;dfs(b,dep&#43;1); --top[b];if(ok) return;qu[a][&#43;&#43;top[a]]&#61;t;break;}
}
int luangao(){ok&#61;0; top[0]&#61;top[1]&#61;top[2]&#61;cnt&#61;0;for(int i&#61;3;i>&#61;1;i--) qu[0][&#43;&#43;top[0]]&#61;i;do{dfs(-1,0);&#43;&#43;cnt;if(cnt>1000) break;}while(!ok);int P&#61;cnt-2;return P;
}
void c233(){ll x&#61;2;for(int i&#61;2;i<&#61;n;i&#43;&#43;) x&#61;x*3;cout<
}
void pow2(){ll x&#61;1;for(int i&#61;1;i<&#61;n;i&#43;&#43;) x&#61;x*2;cout<
}
void pow3(){ll x&#61;1;for(int i&#61;2;i<&#61;n;i&#43;&#43;) x&#61;x*3;cout<<x;
}
int main(){FO(hanoi);//6*???*2^??? scanf("%d",&n);for(int i&#61;0;i<6;i&#43;&#43;)scanf("%s",mov[i]);int ans3&#61;luangao();if(ans3&#61;&#61;17)c233();else if(ans3&#61;&#61;7)pow2();else if(ans3&#61;&#61;9)pow3();else cout<<"规律不对啊 日"; }