2570. 【NOIP2011模拟9.17】数字生成游戏 (Standard IO)
来源:互联网 发布:淘宝达人怎么玩 编辑:程序博客网 时间:2024/06/06 23:16
Description
小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则:1.将s的任意两位对换生成新的数字,例如143可以生成341,413,134;2.将s的任意一位删除生成新的数字,例如143可以生成14,13,433.在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
【样例说明】
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。
题解
乍一看很难,但其实数字只有5位,搜索,枚举,BFS。
代码
var a,b:array[0..100000] of longint; len,x,h,t:longint; s:string;procedure ff1;var i,j,n,l:longint; y,m:string;begin str(x,y); l:=length(y); for i:=1 to l-1 do for j:=i+1 to l do if i<>j then begin m:=copy(y,1,i-1)+y[j]+copy(y,i+1,j-i-1)+y[i]+copy(y,j+1,l); val(m,n); if m='' then exit; if b[n]<0 then begin b[n]:=b[x]+1; inc(t); a[t]:=n; end; end;end;procedure ff2;var i,j,n,l:longint; y,m:string;begin str(x,y); l:=length(y); if l=1 then exit; for i:=1 to l do begin m:=copy(y,1,i-1)+copy(y,i+1,l); if m='' then exit; val(m,n); if b[n]<0 then begin b[n]:=b[x]+1; inc(t); a[t]:=n; end; end;end;procedure ff3;var i,j,n,k,g,l:longint; y,m,z:string;begin str(x,y); l:=length(y); if l>=len then exit; if l=1 then exit; for i:=1 to l-1 do begin val(y[i],k);val(y[i+1],g); for j:=k+1 to g-1 do begin str(j,z); m:=copy(y,1,i)+z+copy(y,i+1,l); val(m,n); if b[n]<0 then begin b[n]:=b[x]+1; inc(t); a[t]:=n; end; end; end;end;var n,m,c,i:longint;begin readln(s); val(s,n); len:=length(s); for i:=0 to 100000 do b[i]:=-1; b[n]:=0; t:=1; a[1]:=n; while h<t do begin inc(h);x:=a[h]; ff1; ff2; ff3; end; readln(m); for i:=1 to m do begin readln(c); writeln(b[c]); end;end.
1 0
- 2570. 【NOIP2011模拟9.17】数字生成游戏 (Standard IO)
- 【NOIP2011模拟9.17】数字生成游戏
- jzoj 2570. 【NOIP2011模拟9.17】数字生成游戏
- 2570. 【NOIP2011模拟9.17】数字生成游戏 (StandardIO)
- 2569. 【NOIP2011模拟9.17】旅行 (Standard IO)
- 2567. 【NOIP2011模拟9.17】电话时间 (Standard IO)
- 2568. 【NOIP2011模拟9.17】地铁建设 (Standard IO)
- 【NOIP2011模拟9.1】统计 (Standard IO)
- 【NOIP2011模拟9.1】直角三角形 (Standard IO)
- 【NOIP2011模拟9.3】跳舞 (Standard IO)
- 【NOIP2011模拟9.3】旅行 (Standard IO)
- 2553. 【NOIP2011模拟9.7】射命丸文 (Standard IO)
- 2555. 【NOIP2011模拟9.7】雾雨魔理沙 (Standard IO)
- 2556. 【NOIP2011模拟9.7】伊吹萃香 (Standard IO)
- 数字游戏 (Standard IO)
- 2032. 数字游戏 (Standard IO)
- 2032. 数字游戏 (Standard IO)
- 【NOIP2011模拟9.1】方格取数 (Standard IO)
- Js封装
- 高斯消元初步
- HDU 1176 免费馅饼 (动态规划)
- 洛谷1113 拓扑序
- hdu-1728逃离迷宫(dfs 求拐弯次数)
- 2570. 【NOIP2011模拟9.17】数字生成游戏 (Standard IO)
- 高斯消元
- hdu-2102A计划(两层地图 bfs或者dfs)
- 采药2(转载)
- PHP Ajax JavaScript 实现 无刷新附件上传
- 46. Permutations (has not been solved yet)
- 47. Permutations II (has not been solved yet)
- hdu-2141Can you find it?(二分搜索求和)
- 2016.08.14【初中部 NOIP提高组 】模拟赛C