89 条题解

  • 0
    @ 2008-11-11 20:40:47

    为什么别人DFS能秒杀我却不能呢??????

  • 0
    @ 2008-11-11 15:42:33

    编译通过...

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

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

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

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

    ├ 测试数据 05:答案正确... 322ms

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

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

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

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

    ├ 测试数据 10:答案正确... 306ms

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

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

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

    ├ 测试数据 14:答案正确... 322ms

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

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

    ├ 测试数据 17:答案正确... 306ms

    ├ 测试数据 18:答案正确... 322ms

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

    ├ 测试数据 20:答案正确... 322ms

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

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

  • 0
    @ 2008-11-11 15:07:36

    编译通过...

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

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

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

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

    ├ 测试数据 05:答案正确... 322ms

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

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

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

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

    ├ 测试数据 10:答案正确... 322ms

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

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

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

    ├ 测试数据 14:答案正确... 353ms

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

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

    ├ 测试数据 17:答案正确... 338ms

    ├ 测试数据 18:答案正确... 369ms

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

    ├ 测试数据 20:答案正确... 400ms

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

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

    数据量很小,与处理后直接floyed.

    program lx;

    var m,n,i,j,t,k :longint;

    d:array[0..500,0..500] of longint;

    s1,s0,s:string;

    procedure pan;

    var o:longint;

    begin

    o:=0;

    if (i1) then

    begin if s1[j]s[j] then o:=1;

    d[t,t-n]:=o;d[t-n,t]:=o;end;

    o:=0;

    if (J1) then

    begin if s[j]s[j-1] then o:=1;

    d[t,t-1]:=o;d[t-1,t]:=o;end;

    end;

    begin

    readln(m,n);

    for i:=0 to 500 do for j:=0 to 500 do d:=maxint;

    for i:=1 to m do

    begin

    readln(s);

    for j:=1 to n do

    begin

    t:=t+1;;d[t,t]:=0;

    pan;

    end;

    s1:=s;if i=1 then s0:=s;

    end;

    for k:=1 to t do

    for i:=1 to t do

    if ki then

    for j:=1 to t do

    if (ij)and(kj) then

    begin

    if d+d[k,j]

  • 0
    @ 2008-11-10 19:45:44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    自己都不知道用了什么方法。。。。

  • 0
    @ 2008-11-06 16:36:40

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    DFS!!!不过不能直接DIJKSTRA!WA了一次!

  • 0
    @ 2008-11-01 10:56:22

    编译错误!!!!!!!!!!!!...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Accepted 有效得分:100 有效耗时:100000000000000year

  • 0
    @ 2008-10-30 20:40:44

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    program p1406;

    const maxn=200;

    gx:array[1..4] of integer=(0,1,0,-1);

    gy:array[1..4] of integer=(1,0,-1,0);

    var i,j,k,m,n,ans:longint;

    dis:array[1..maxn,1..maxn] of longint;

    pic:array[0..maxn,0..maxn] of char;

    visit:array[0..maxn,0..maxn] of boolean;

    procedure init;

    var i,j:longint;

    begin

    fillchar(pic,sizeof(pic),0);

    fillchar(dis,sizeof(dis),0);

    readln(m,n);

    for i:=1 to m do begin

    for j:=1 to n do

    read(pic);

    readln;

    end;

    ans:=maxlongint;

    end;

    procedure dfs(x,y,l:Longint);

    var i,j,k:longint;

    begin

    visit[x,y]:=true;

    dis[x,y]:=l;

    for i:=1 to 4 do

    begin

    j:=x+gx[i]; k:=y+gy[i];

    if ((j0)and(k0)) then begin

    if ((pic[j,k]=pic[x,y])and((l

  • 0
    @ 2008-10-29 12:04:27

    编译通过...

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

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

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

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

    ├ 测试数据 05:答案正确... 633ms

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

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

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

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

    ├ 测试数据 10:答案正确... 618ms

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

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

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

    ├ 测试数据 14:答案正确... 618ms

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

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

    ├ 测试数据 17:答案正确... 633ms

    ├ 测试数据 18:答案正确... 618ms

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

    ├ 测试数据 20:答案正确... 618ms

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

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

    裸FLOYD,时间很整齐。。。

  • 0
    @ 2008-10-23 19:06:22

    秒杀过....要是数据大一点就不能了吧.....

    直接记忆化

  • 0
    @ 2008-10-22 21:55:44

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2008-10-22 20:37:18

    记忆化DFS.

    很快的.

    而且代码很好写.

    Floodfill+Dijikstra代码有点长..

  • 0
    @ 2008-10-20 19:46:02

    program aa

    procedure dfs(x,y,w:longint);

    begin

      b[x,y]:=true;

      inc(r);

      p[r]:=x;q[r]:=y;f[x,y]:=w;

      if (a[x-1,y]=a[x,y])and(not b[x-1,y])then dfs(x-1,y,w);

      if (a[x,y-1]=a[x,y])and(not b[x,y-1])then dfs(x,y-1,w);

      if (a[x+1,y]=a[x,y])and(not b[x+1,y])then dfs(x+1,y,w);

      if (a[x,y+1]=a[x,y])and(not b[x,y+1])then dfs(x,y+1,w)

    end;

    for i:=1 to m do if not b[1,i]then dfs(1,i,1);

    l:=1;

    while l1)and(not b[p[l]-1,q[l]])then dfs(p[l]-1,q[l],f[p[l],q[l]]+1);

       if (p[l]1)and(not b[p[l],q[l]-1])then dfs(p[l],q[l]-1,f[p[l],q[l]]+1);

       if (q[l]

  • 0
    @ 2008-10-13 23:12:40

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    纪念下···

    感谢楼下的 IEK

  • 0
    @ 2008-10-13 22:11:17

    ``记忆直接DFS进去。

    一开始吧X,Y弄反了。。

    郁闷了好久。。

    FILLDWORD忘记了 DIV 4.

    今天RP这么低。。

    LP不稳定。有一次95分。。

  • 0
    @ 2008-10-08 09:19:14

    Floodfill,然后构图,找最短路

  • 0
    @ 2008-10-02 20:01:22

    找出题目中隐含的关系:如果相邻两点不同,则代价1,相同则代价0。转化成最短路问题。

    解法1: Floodfill+dijkstra

    先用floodfill把每个区间都标上号,然后扫描一遍,如果两个不同区间相连就把权设成1吧。为了方便起见,设一个源点和汇点(我的程序里面是在最上面和最下面都加了一行),做dijkstra。

    const

    d:array[1..4,1..2]of longint=((0,1),(0,-1),(1,0),(-1,0));

    var

    i,j,k,l,m,n,now,ii,jj,s,min:longint;

    a:array[-1..23,-1..23]of char;

    num:array[-1..23,-1..23]of longint;

    aa:array[1..500,1..500]of longint;

    dd:array[1..500]of longint;

    v:array[1..500]of boolean;

    procedure dfs(x,y,ss:longint);

    var

    i,xx,yy:longint;

    begin

    num[x,y]:=ss;

    for i:=1 to 4 do

    begin

    xx:=x+d; yy:=y+d;

    if (num[xx,yy]=-1)and(a[xx,yy]=a[x,y]) then dfs(xx,yy,ss);

    end;

    end;

    begin

    assign(input,'1406.in');reset(input);

    readln(n,m);

    for i:=-1 to 23 do for j:=-1 to 23 do a:='-';

    for j:=1 to m do begin a[0,j]:='0'; a[n+1,j]:='0'; end;

    for i:=1 to n do

    begin

    for j:=1 to m do read(a);

    readln;

    end;

    now:=0;

    fillchar(num,sizeof(num),$FF);

    for i:=0 to n+1 do

    for j:=1 to m do

    if num=-1 then begin inc(now); dfs(i,j,now); end;

    for i:=0 to n+1 do

    for j:=1 to m do

    for k:=1 to 4 do

    begin

    ii:=i+d[k,1]; jj:=j+d[k,2];

    if (a[ii,jj]a)and(a[ii,jj]'-') then aa[num,num[ii,jj]]:=1;

    end;

    {dijkstra}

    fillchar(v,sizeof(v),false);

    fillchar(dd,sizeof(dd),0);

    s:=1; v:=true;

    repeat

    m:=maxlongint; k:=0;

    for i:=1 to now do

    begin

    if (aa=1)and((dd+aa

  • 0
    @ 2008-09-29 18:00:23

    这是一个很隐蔽的最短路径问题……

    相邻结点,如果字母相同则表示距离为 0,否则就是 1

    把第一行结点全放入优先队列,然后……

  • 0
    @ 2008-09-28 13:26:53

    DP...

    就是用FLOODFILL实现的记忆化搜索的DP...

    跟清帝之惑的滑雪差不多...

    要不要环行队列MS都可以

  • 0
    @ 2008-09-25 15:37:41

    因为我是猥琐男,所以我用了猥琐的广搜套深搜的方法...39行Code

    procedure dfs(x,y,w:longint);

    begin

    b[x,y]:=true;

    inc(r);

    p[r]:=x;q[r]:=y;f[x,y]:=w;

    if (a[x-1,y]=a[x,y])and(not b[x-1,y])then dfs(x-1,y,w);

    if (a[x,y-1]=a[x,y])and(not b[x,y-1])then dfs(x,y-1,w);

    if (a[x+1,y]=a[x,y])and(not b[x+1,y])then dfs(x+1,y,w);

    if (a[x,y+1]=a[x,y])and(not b[x,y+1])then dfs(x,y+1,w)

    end;

    for i:=1 to m do if not b[1,i]then dfs(1,i,1);

    l:=1;

    while l1)and(not b[p[l]-1,q[l]])then dfs(p[l]-1,q[l],f[p[l],q[l]]+1);

    if (p[l]1)and(not b[p[l],q[l]-1])then dfs(p[l],q[l]-1,f[p[l],q[l]]+1);

    if (q[l]

  • 0
    @ 2008-09-19 00:00:35

    看到这个题下面的大牛有用DP和图做的,实在太强了。

    这个题我是用深搜做的,只加了一个小小的剪枝。我的搜索结构很简单,就是每一步个向四个方向搜,然后记录到每个点最小步数,每次搜到这个点就更新最小值。

    大体如下:

    for i:=1 to 4 do

    begin

    xx:=dx[i]+x; yy:=dy[i]+y;

    if not vis[xx][yy] then

    begin

    vis[xx][yy]:=true;

    if dat[xx][yy]=dat[x][y] then//相同

    if ans[xx][yy]>ans[x][y] then//当下一个点不如这个优时DFS

    begin

    ans[xx][yy]:=ans[x][y];

    dfs(xx,yy);

    end;

    if dat[xx][yy]dat[x][y] then

    if ans[xx][yy]>ans[x][y]+1 then

    begin

    ans[xx][yy]:=ans[x][y]+1;//步数加一

    if ans[xx][yy]

信息

ID
1406
难度
6
分类
图结构 | 最短路 点击显示
标签
(无)
递交数
1512
已通过
464
通过率
31%
被复制
2
上传者