数字生成游戏_纪中2570_bfs
2016-08-15 15:33
344 查看
Description
小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则:
将s的任意两位对换生成新的数字,例如143可以生成341,413,134;
将s的任意一位删除生成新的数字,例如143可以生成14,13,43
在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i]
第2行包含一个正整数m,为询问个数。
接下来m行,每行一个整数t(t不包含0),表示询问从s开始不断生成数字到t最少要进行多少次操作。任两个询问独立,即上一个询问生成过的数到下一个询问都不存在,只剩下初始数字s。
对于40%的数据,s<1000;
对于40%的数据,m<10;
对于60%的数据,s<10000;
对于100%的数据,s<100000,m≤50000
数字转成字符串作brute force search bfs,用桶记录步数,可以预处理所有可能,O(1)求解
小明完成了这样一个数字生成游戏,对于一个不包含0的数字s来说,有以下3种生成新的数的规则:
将s的任意两位对换生成新的数字,例如143可以生成341,413,134;
将s的任意一位删除生成新的数字,例如143可以生成14,13,43
在s的相邻两位之间s[i],s[i + 1]之间插入一个数字x,x需要满足s[i]
Input
输入文件gen.in的第一行包含1个正整数,为初始数字s。第2行包含一个正整数m,为询问个数。
接下来m行,每行一个整数t(t不包含0),表示询问从s开始不断生成数字到t最少要进行多少次操作。任两个询问独立,即上一个询问生成过的数到下一个询问都不存在,只剩下初始数字s。
Output
输出文件gen.out包括m行,每行一个正整数,对每个询问输出最少操作数,如果无论也变换不成,则输出-1。Data Constraint
[数据规模与约定]
对于20%的数据,s<100;对于40%的数据,s<1000;
对于40%的数据,m<10;
对于60%的数据,s<10000;
对于100%的数据,s<100000,m≤50000
题解
s很小而且不含0,所以真正有用的状态很小数字转成字符串作brute force search bfs,用桶记录步数,可以预处理所有可能,O(1)求解
Code
var n,m:longint; t:array[0..999999]of longint; state:array[0..1000001]of string[8]; s:string[8]; procedure bfs; var i,j,r,u,len,head,tail,a,b:longint; v,tmp:string; c:char; begin head:=0; tail:=1; state[tail]:=s; val(s,r); t[r]:=1; repeat inc(head); v:=state[head]; val(v,r); len:=length(v); for i:=1 to len-1 do for j:=i+1 to len do begin tmp:=v; c:=tmp[i]; tmp[i]:=tmp[j]; tmp[j]:=c; val(tmp,u); if (t[u]=0) then begin t[u]:=t[r]+1; inc(tail); state[tail]:=tmp; end; end; if len>1 then for i:=1 to len do begin tmp:=v; delete(tmp,i,1); val(tmp,u); if (t[u]=0) then begin t[u]:=t[r]+1; inc(tail); state[tail]:=tmp; end; end; if (len<length(s)) then for i:=2 to len do begin a:=ord(v[i-1])-48; b:=ord(v[i])-48; for j:=a+1 to b-1 do begin tmp:=v; c:=chr(j+48); insert(c,tmp,i); val(tmp,u); if (t[u]=0) then begin t[u]:=t[r]+1; inc(tail); state[tail]:=tmp; end; end; end; until head>=tail; end; begin readln(s); bfs; readln(m); while (m>0) do begin dec(m); readln(n); writeln(t -1); end; end.
相关文章推荐
- [图解tensorflow源码] 入门准备工作
- CodeForce 510 B
- 验证签名机制——java示例
- 【985系列】985的买饮料难题
- iptables 详解
- 命名空间、闭包、上下文管理器、鸭子类型与多态(10)
- spring入门(一)
- Modular Programming with JavaScript-Packt Publishing 2016(读书笔记)
- 实例:ABAP权限对象设计与权限检查的实现(详细)
- 二分图最大匹配模板
- 对象锁和类锁的区别
- java工程_web.xml配置session有效期
- 03、canvas标签之绘制矩形
- C语言基本教程 第3课: C程序基本概念
- poj 2796
- Java中的访问控制符
- RXAndroid入门
- Java代理和动态代理
- C#中的委托,匿名方法和Lambda表达式
- 图形区域填充算法