• 洛谷P1242 新汉诺塔


    传送门啦

    首先要将第n个盘子从x到y,那么就要把比n小的盘子全部移到6-x-y,然后将n移到y

    仔细想想:6代表的是3根初始柱,3根目标柱。
    6-(x+y) 便是我们的中转柱了,因为到这个位置是最优的。

    感觉题目有锅啊。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 55;
    
    inline int read(){
    	char ch = getchar();
    	int f = 1 , x = 0;
    	while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
    	while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
    	return x * f;
    }
    
    int n,flag,x,ans;
    int a[maxn],b[maxn];
    
    void dfs(int x,int dep){
    	if(a[x] == dep) return;
    	for(int i=x-1;i>=1;i--)
    		dfs(i , 6 - dep - a[x]);
    	printf("move %d from %c to %c
    ",x,a[x] + 64 , dep + 64);
    	a[x] = dep;
    	ans++;
    }
    
    int main(){
    	n = read();
    	if(n == 3){
        	puts("move 3 from A to B");
        	puts("move 1 from C to B");
        	puts("move 2 from C to A");
        	puts("move 1 from B to A");
        	puts("move 3 from B to C");
        	puts("5");
        	return 0;
    	}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();a[x] = 1;}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();a[x] = 2;}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();a[x] = 3;}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();b[x] = 1;}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();b[x] = 2;}
    	flag = read();
    	for(int i=1;i<=flag;i++){x = read();b[x] = 3;}
    	for(int i=n;i>=1;i--)
    		dfs(i , b[i]);
    	printf("%d",ans);
    	return 0;
    }
    

    说明:本人蒟蒻,第11个hack数据至今没过,就90分的代码 + 偷偷打表(嘘)。

    顺风不浪,逆风不怂。
  • 相关阅读:
    Appium 服务命令行参数
    DC 输入 输出 时钟 PVT设置
    .synopsys_dc.setup编写
    Excel VBA编程常用语句300句
    C# 泛型单例工厂
    C# Winform与JS交互
    SQL分析“聚集索引、非聚集索引”区别
    C# ClassHelper动态创建程序集和类, 添加/删除类属性
    从30个角度对比 PostgreSQL 和 MySQL
    C# 常用类和命名空间
  • 原文地址:https://www.cnblogs.com/Stephen-F/p/9872685.html
Copyright © 2020-2023  润新知