• 翻币问题pascal程序


    Description

    有N个硬币(6<=N<=20000)全部正面朝上排成一排,每次将其中5个硬币翻过来放在原位置,直到最后全部硬币翻成反面朝上为止。试编程找出步数最少的翻法,输出最少步数及翻法。

    Input

    从键盘输入一个正整数N(6<=N<=20000),表示硬币的数量。

    Output

    第1行:一个整数,表示最少步数
    第2行至最后一行:先是一个整数,表示步骤序号(从0开始编号),后接一个":",再接当前硬币的状态(用一个整数表示正面朝上的硬币的个数)

    Sample Input

    6  (开始:6个硬币正面朝上)

    Sample Output

    0:6   (第0步结果:6个硬币正面朝上)
    1:1   (第1步结果:1个硬币正面朝上)
    2:4   (第2步结果:4个硬币正面朝上)
    3:3   (第3步结果:3个硬币正面朝上)
    4:2   (第4步结果:2个硬币正面朝上)
    5:5   (第5步结果:5个硬币正面朝上)
    6:0   (第6步结果:0个硬币正面朝上)
    6     (最少用6步实现全部反面朝上)
    
    
    
    
    

    Hint

    只输出最少次数,其变化过程仅作参考


    这题我是用广度优先搜索做的

    看懂题目就好做多了
    主要就是判断硬币满不满足翻的条件(即不能将五个正面翻成二反三正之类的) 
    还有判断这种正与反的情况有没有出现过


    var
    father,state:array[0..20000]of longint;
    n,tj:longint;
    procedure print(x:longint);
    begin
        if x=0 then exit;
        print(father[x]);
        inc(tj);
    end;


    procedure bfs;
    var
    head,tail,i,j:longint;
    begin
        head:=0;tail:=1;state[1]:=n;
        repeat
             inc(head);
             for i:=0 to 5 do
             begin
                 if (state[head]>=i)and(n-state[head]>=5-i) then
                 begin
                     inc(tail);
                     father[tail]:=head;
                     state[tail]:=state[head]-i+5-i;
                     for j:=1 to tail-1 do
                     if state[j]=state[tail] then
                     begin
                         dec(tail);
                         break;
                     end;
                     if state[tail]=0 then
                     begin
                         print(tail);
                         tail:=0;
                     end;
                 end;
             end;
        until head>=tail;
    end;


    begin
        read(n);
        bfs;
        write(tj-1);
    end.

  • 相关阅读:
    triplet loss 在深度学习中主要应用在什么地方?有什么明显的优势?
    一个评测指标就是MAP(Mean Average Precision)平均精度均值。
    机器学习术语中英对照表
    logistic softmax
    mysql导出导入sql文件方法(linux)
    mysql分区表
    matplotlib安装错误依赖问题解决
    linux命令集合
    linux下安装或升级GCC4.8.2,以支持C++11标准[转]
    linux 如何显示一个文件的某几行(中间几行)
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500234.html
Copyright © 2020-2023  润新知