列表

详情


NC201605. Bits

描述

Nancy喜欢做游戏!
汉诺塔是一个神奇的游戏,神奇在哪里呢?
给出3根柱子,最开始时n个盘子按照大小被置于最左的柱子。
如果盘子数为偶数,则需要将她们全部移动到最右侧的柱子上,否则将她们移动到中间的柱子上。
那么,Nancy该怎样移动呢?请你输出汉诺塔游戏的过程叭!

输入描述

共一行:一个整数n,表示最开始n个盘子(编号为1到n)的放置方法。

数据满足:

输出描述

组:每组n+2行,每行个字符,用.表示空白区域,用|表示柱子区域,用*表示盘子。组与组之间请输出个-。
具体输出方式请参看样例进行理解。

示例1

输入:

2

输出:

...................
...|.....|.....|...
..***....|.....|...
.*****...|.....|...
-------------------
...................
...|.....|.....|...
...|.....|.....|...
.*****..***....|...
-------------------
...................
...|.....|.....|...
...|.....|.....|...
...|....***..*****.
-------------------
...................
...|.....|.....|...
...|.....|....***..
...|.....|...*****.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 63ms, 内存消耗: 2472K, 提交时间: 2022-09-05 09:27:44

#include <bits/stdc++.h>
using namespace std;
vector<int> A, B, C;
int n;
string p2(int x) {
  if (x == 0) return string(n+1, '.') + "|" + string(n, '.');
  return string(n-x+1, '.') + string(2*x+1, '*') +string(n-x, '.');
}
void p() {
  cout << string(3*(2*n+1)+4, '.') << endl;
  for (int i = n; i >= 0; i--) {
    cout << p2(i < A.size()?A[i]: 0) << p2(i < B.size()?B[i]: 0) << p2(i < C.size()?C[i]: 0) << "." << endl;
  }
}
void gao(int l, vector<int> &a, vector<int> &b, vector<int> &c) {
  if (l == 0) return;
  gao(l-1, a, c, b);
  c.push_back(a.back());
  a.pop_back();
  cout << string(3*(2*n+1)+4, '-') << endl;
  p();
  gao(l-1, b, a, c);
}
int main() {
  cin >> n;
  for (int i = n; i >= 1; i--) A.push_back(i);
  p();
  if (n%2==0) gao(n, A, B, C);
  else gao(n, A, C, B);
}

C++(clang++ 11.0.1) 解法, 执行用时: 65ms, 内存消耗: 2416K, 提交时间: 2023-06-06 19:44:08

#include<bits/stdc++.h>
using namespace std;
vector<int>a,b,c;
int n;
string p2(int x){
	if(x==0)
	return string(n+1,'.')+"|"+string(n,'.');
	else
	return string(n-x+1,'.')+string(2*x+1,'*')+string(n-x,'.'); 
	
}
void p(){
	cout<<string(3*(2*n+1)+4,'.')<<endl;
	for(int i=n;i>=0;i--)
	cout<<p2(i<a.size()?a[i]:0)<<p2(i<b.size()?b[i]:0)<<p2(i<c.size()?c[i]:0)<<"."<<endl;
}
void han(int l,vector<int>&a,vector<int>&b,vector<int>&c){
	if(l==0)return;
	han(l-1,a,c,b);
	c.push_back(a.back());
	a.pop_back();
	cout<<string(3*(2*n+1)+4,'-')<<endl;
	p();
	han(l-1,b,a,c);
}
int main(){
	cin>>n;
	for(int i=n;i>=1;i--)a.push_back(i);
	p();
	if(n%2)
	han(n,a,c,b);
	else
	han(n,a,b,c);
}

上一题