2570. 【NOIP2011模拟9.17】数字生成游戏 (StandardIO)

2570. 【NOIP2011模拟9.17】数字生成游戏 (StandardIO)

Description

    小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则:
    1.将s的任意两位对换生成新的数字,例如143可以生成341,413,134;
    2.将s的任意一位删除生成新的数字,例如143可以生成14,13,43
    3.在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i]<x<s[i + 1],即比它插入位置两边的数小。例如143可以生成1243,1343,但是不能生成1143,1543等。
    现在小明想知道,在这个生成法则下,从s开始,每次生成一个数,可以用新生成的数生成另外一个数,不断生成直到生成t至少需要多少次生成操作。
    另外,小明给规则3又加了一个限制,即生成数的位数不能超过初始数s的位数。若s是143,那么1243与1343都是无法生成的;若s为1443,那么可以将s删除4变为143,再生成1243或1343。

Input

输入文件gen.in的第一行包含1个正整数,为初始数字s。
第2行包含一个正整数m,为询问个数。
接下来m行,每行一个整数t(t不包含0),表示询问从s开始不断生成数字到t最少要进行多少次操作。任两个询问独立,即上一个询问生成过的数到下一个询问都不存在,只剩下初始数字s。

Output

    输出文件gen.out包括m行,每行一个正整数,对每个询问输出最少操作数,如果无论也变换不成,则输出-1。

Sample Input

 143
 3
 134
 133
 32

Sample Output

 1
 -1
 4

Data Constraint

【样例说明】
143->134
133无法得到
143->13->123->23->32
【数据规模与约定】
对于20%的数据,s<100;
对于40%的数据,s<1000;
对于40%的数据,m<10;
对于60%的数据,s<10000;
对于100%的数据,s<100000,m≤50000。

 

给个程序,没时间打思路了,反正就是一个搜索,没什么好讲的

 
const
 maxn=1000000;
var
 s:array[0..maxn] of string;
 state:array [0..maxn] of longint;
 hjy:array[0..maxn] of longint;
 i,j,n,p,o:longint;
 s1:string;
procedure bfs;
var
 head,tail,i,j,m,o:longint;
 c,ii:char;
begin
 fillchar(hjy,sizeof(hjy),255);
 s[1]:=s1;
 state[1]:=0;
 val(s1,o);
 hjy[o]:=0;
 head:=0;
 tail:=1;
 repeat
 inc(head);
 m:=length(s[head]);
  fori:=1 to  m do
   forj:=i+1 to m do
    begin
    inc(tail);
    s[tail]:=s[head];
    c:=s[tail,i];
    s[tail,i]:=s[tail,j];
    s[tail,j]:=c;
    val(s[tail],o);
     state[tail]:=state[head]+1;
     ifhjy[o]<>-1 then dec(tail)
                  else hjy[o]:=state[tail];
    end;
   ifm<>1 then
   fori:=1 to m do
   begin
   inc(tail);
   s[tail]:=s[head];
   delete(s[tail],i,1);
   val(s[tail],o);
    state[tail]:=state[head]+1;
    ifhjy[o]<>-1 then dec(tail)
                     else hjy[o]:=state[tail];
   end;
   ifm<p then
   fori:=1 to m-1 do
   begin
 
    forii:=chr(ord(s[head,i])+1) to chr(ord(s[head,i+1])-1) do
     begin
     inc(tail);
      s[tail]:=s[head];
     insert(ii,s[tail],i+1);
     val(s[tail],o);
     state[tail]:=state[head]+1;
     if hjy[o]<>-1 then dec(tail)
                else hjy[o]:=state[tail];
     end;
   end;
 untilhead>tail;
 
end;
 
 
begin
 readln(s1);
 p:=length(s1);
 readln(n);
 bfs;
 fori:=1 to n do
 begin
 readln(o);
 writeln(hjy[o]);
 end;
end.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值