题解

67 条题解

  • 0
    @ 2008-09-04 15:30:16

    var

    i,j,n,m,ans,t:integer;

    chr:char;

    a:array[1..100,1..100] of char;

    b:array['A'..'Z'] of boolean;

    c:array['A'..'Z',1..4] of integer;

    f:array['A'..'Z','A'..'Z'] of boolean;

    w:array[1..100] of string;

    procedure output;

    var lk:integer;

    begin

    for lk:=1 to t do

    writeln(w[lk]);

    end;

    procedure qsort(lx,rx:longint);

    var

    i,j:longint;

    mid,tt:string;

    begin

    i:=lx;

    j:=rx;

    mid:=w[(i+j)shr 1];

    repeat

    while w[i]mid do dec(j);

    if ij;

    if ilx then qsort(lx,j);

    end;

    procedure print(l:string);

    var o:integer;

    begin

    t:=t+1;w[t]:='';

    for o:=1 to ans do

    w[t]:=w[t]+l[o];

    end;

    function tr(qq:char;stri:string):boolean;

    var ll,kkl:integer;

    begin

    tr:=true;

    ll:=length(stri);

    for kkl:=1 to ll do

    if (f[qq,stri[kkl]]) then

    begin

    tr:=false;

    exit;

    end;

    end;

    procedure dij;

    var ii,jj,kk:char;

    qq:boolean;

    begin

    repeat

    qq:=false;

    for ii:='A' to 'Z' do

    for jj:='A' to 'Z' do

    for kk:='A' to 'Z' do

    if (iijj) and (iikk) and (jjkk) then

    if (f[ii,kk]) and (f[kk,jj]) and (not f[ii,jj]) then

    begin

    f[ii,jj]:=true;

    qq:=true;

    end;

    until qq=false;

    end;

    procedure topu(cc:char;s:string);

    var q:char;

    begin

    if length(s)=ans then begin print(s);exit;end;

    for q:='A' to 'Z' do

    if (b[q]) and (pos(q,s)=0) and (tr(q,s)) then topu(q,s+q);

    end;

    procedure fugai(cr:char);

    var p1,p2:integer;

    begin

    for p1:=c[cr,1] to c[cr,3] do

    begin

    if (a[p1,c[cr,2]]cr) then f[cr,a[p1,c[cr,2]]]:=true;

    if (a[p1,c[cr,4]]cr) then f[cr,a[p1,c[cr,4]]]:=true;

    end;

    for p2:=c[cr,4] to c[cr,2] do

    begin

    if (a[c[cr,1],p2]cr) then f[cr,a[c[cr,1],p2]]:=true;

    if (a[c[cr,3],p2]cr) then f[cr,a[c[cr,3],p2]]:=true;

    end;

    end;

    procedure find(ch:char);

    var

    k1,k2:integer;

    begin

    c[ch,1]:=maxint;

    c[ch,2]:=0;

    c[ch,3]:=0;

    c[ch,4]:=maxint;

    for k1:=1 to n do

    for k2:=1 to m do

    if a[k1,k2]=ch then

    begin

    if k1c[ch,2] then c[ch,2]:=k2;

    if k1>c[ch,3] then c[ch,3]:=k1;

    if k2

  • 0
    @ 2008-08-28 10:20:36

    USACO的原题

  • 0
    @ 2008-08-26 09:49:47

    拓仆排序而已,先处理图像,记录下各矩形的上下左右边界,再对各矩形扫描一次,假设扫描到矩形A的某一个位置时发现显示的是矩形B,那么就令F['B','A']为TRUE,即表示B到A的一条有向边,扫描完一个矩形后计算一下它的入度。

    将没有出现过的矩形的FLAG标记为TRUE,接下来就是单纯的拓仆排序了,拓仆排序是什么?自己查吧。

    procedure search(x:longint; ch:char);

    var ich:char;

    begin

    st:=ch+st; flag[ch]:=true;

    if x=n then begin

    inc(c); ans[c]:=st;

    end else begin

    for ich:='A' to 'Z' do

    if f[ch,ich] then dec(d[ich]);

    for ich:='A' to 'Z' do

    if not flag[ich] and (d[ich]=0) then

    search(x+1,ich);

    for ich:='A' to 'Z' do

    if f[ch,ich] then inc(d[ich]);

    end;

    delete(st,1,1); flag[ch]:=false;

    end;

    主程序中:

    for ch:='A' to 'Z' do

    if not flag[ch] and (d[ch]=0) then search(1,ch);

    要排序,VIJOS上的数据太弱了,我开的1000的ANS数组,冒泡排序0MS

    USACO上要开10000的数组,用快排

  • 0
    @ 2008-08-10 12:00:47

    搜索+弱弱优化=AC

  • 0
    @ 2008-08-04 15:12:14

    总第800次提交终于过了,原来一直只过一半,后来发现在生成放置方式的时候没有按字典顺序,加了个排序就过了!开心啊这么久,再次不看题解过了一道题!

  • 0
    @ 2008-07-21 09:57:03

    从后往前搜,先搜最后放的那个,这样可以一边搜一边判断是否误放,可以说,这样搜不会浪费时间,应该比较快吧。

  • 0
    @ 2008-07-14 16:49:17

    编译通过...

    ├ 测试数据 01:运行超时...

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:75 有效耗时:0ms

    ........................无语了

    问下,这个可能是为什么啊

  • 0
    @ 2007-11-14 09:31:56

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2007-11-13 15:11:15

    数据太弱

  • 0
    @ 2007-11-11 12:04:10

    我觉得时间复杂度可以优化一下

    我的方法是

    先看能找到哪个方框全是由一个字母组成的

    就是最上面的,

    下面找由n-1个字母组成的,类推。

    假如找不到,则开始搜索

    这样可以快很多滴鸭

  • 0
    @ 2007-11-10 21:02:16

    用五个数组记录一开始的摆放

    然后搜索从第1,2,3,..先放

    在搜索接下来的......

    搜到和输入的答案一样的就退出

  • 0
    @ 2007-11-08 20:26:05

    讲清楚步骤吧,不会啊,哈哈哈

  • 0
    @ 2007-11-07 11:20:06

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    先构图然后拓扑排序就行了。

  • 0
    @ 2007-11-06 13:26:02

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    这道题我认为比较难,没有whqlsc的帮助我

    是无法通过的,orz whqlsc神牛

  • 0
    @ 2007-10-29 18:10:52

    晕,不用那么长,80行足够了,4个0ms。数据太弱了!

    先预处理,计算出哪个盖着哪个,然后直接DFS。最后快排结果,输出。

  • 0
    @ 2007-10-28 19:00:55

    我这么弱也能0ms..

    上帝啊,146行,好久没打这么长的东西了。从饭前打到饭后。

    一直侥幸的希望不打拓补,事实证明是不可以的,于是最后还是打了。

  • 0
    @ 2007-10-11 12:38:52

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    简单的拓扑排序

  • 0
    @ 2007-08-12 19:32:42

    topu排序加bfs

  • 0
    @ 2007-08-09 20:29:14

    比较深的图形处理

  • 0
    @ 2007-08-03 14:47:58

    数据的确比较弱。。。

信息

ID
1030
难度
5
分类
搜索 | 搜索与剪枝 点击显示
标签
(无)
递交数
1126
已通过
419
通过率
37%
被复制
9
上传者