zoukankan      html  css  js  c++  java
  • 隐藏的信息

    【问题描述】
    FBI事件后,北斗星司在一个荒山野岭遇到了两个安培拉星人的谈话,由于北斗星司也是外星人,所以他听懂了谈话的内容- -
    安培拉星人A说:1234567
    安培拉星人B说:了解,我将回去报告长官
    显然,安培拉星人A说的是一串密码,且我们已知安培拉星通用一种加密方式,即在一个仅含有数字1-9(且每个数字最多出现一次)的数字N中,将N中的每一位重新排列(可以将N里的所有位全部重新排列,也可以只重新排列几位,或者不重新排列),使得排列后的新数字M是数字P~Q的公倍数,那么M就是N所隐藏的密码

    【输入文件】
    两行,第一行一个数字N(N的长度..不用我说了吧?)第二行两个数P、Q(1<=P<=Q<=20)

    【输出文件】
    一个或多个M,表示排列以后的新数字(M必定为数字P~Q的公倍数),若无答案则输出‘No answer’(引号不输出),若多解则从小到大输出

    【样例输入1】
    132
    1 3

    【样例输出1】
    132
    312

    分析
    全排列,再把求出来的数除以p to q,若能全部整除,则输出此数。

    程序:

    var
    zfc:string;
    f,a:array[0..1000000]of longint;
    zf:char;
    p,q:integer;
    i,j,tj,n,l:longint;
    
    procedure print(s:string);
    var
    sz,made,w,bz:longint;
    begin
        val(s,sz,made);
        bz:=0;
        if sz mod p<>0 then bz:=1;
        if sz mod q<>0 then bz:=1;
        for w:=p to q do
        if sz mod w<>0 then
        begin
            bz:=1;
            break;
        end;
        if bz=0 then
        begin
            inc(tj);
            writeln(sz);
        end;
    end;
    
    procedure kp(l,r:longint);
    var
    i,j:longint;
    mid:char;
    begin
        if l>=r then exit;
        i:=l;j:=r;mid:=zfc[(l+r) div 2];
        repeat
             while zfc[i]<mid do inc(i);
             while zfc[j]>mid do dec(j);
             if i<=j then
             begin
                 zfc[0]:=zfc[i];zfc[i]:=zfc[j];zfc[j]:=zfc[0];
                 inc(i);dec(j);
             end;
        until i>j;
        kp(l,j);
        kp(i,r);
    end;
    
    procedure dfs(dep:longint;s:string);
    var
    i:longint;
    begin
        if dep=l then
        begin
            print(s);
            exit;
        end;
        for i:=1 to l do
        if f[i]=0 then
        begin
            f[i]:=1;
            dfs(dep+1,s+zfc[i]);
            f[i]:=0;
        end;
    
    end;
    
    begin
        assign(input,'lcs.in');
        reset(input);
        assign(output,'lcs.out');
        rewrite(output);
        readln(zfc);
        read(p,q);
        l:=length(zfc);
        tj:=0;
        fillchar(f,sizeof(f),0);
        kp(1,l);
        dfs(0,'');
        n:=tj;
        if n=0 then write('No answer');
        close(input);
        close(output);
    end.
  • 相关阅读:
    28、数组中出现次数超过一半的数字
    27、字符串的排列
    26、二叉搜索树与双向链表
    21、栈的压入、弹出序列
    22、从上往下打印二叉树
    23、二叉搜索树的后序遍历序列
    24、二叉树中和为某一值的路径
    25、复杂链表的复制
    4、简单工厂模式,工厂方法模式,
    基数排序
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500059.html
Copyright © 2011-2022 走看看