题解

35 条题解

  • 5
    @ 2018-09-06 16:37:04

    出题人对于坐标的理解真是毁天灭地。。。(既然是OI题就不能按OIer的习惯来吗)
    注意到人每次只能往下或者往右走,于是可以用dp来做
    预处理蝙蝠的情况,当某一时刻蝙蝠所在的点人恰好也会走到时,这个点就不能通过了,蝙蝠的行动和转向可以用数组搞出来
    这坐标真令人自闭。。。

    #include<iostream>
    using namespace std;
    int map[110][110],dp[110][110],bx[5]={0,0,-1,0,1},by[5]={0,-1,0,1,0};
    int z[4][5]={   0,0,0,0,0,
                    0,2,3,4,1,
                    0,3,4,1,2,
                    0,4,1,2,3
                };
    int main()
    {
        int m,n,p,i,j,x,y,b,d,t,now;
        cin>>m>>n>>p;
        for(i=1;i<=p;i++)
         {
            cin>>x>>y;
            map[y][x]=1;
         }
        cin>>b;
        for(i=1;i<=b;i++)
        {
            cin>>x>>y>>d>>t;
            if(map[y][x]==1)
             continue;
            now=1;
            while(now<=m+n-1)
            {
                if(now==x+y-1)
                 map[y][x]=2;
                int ha=0; 
                while(1)//这里是防止有蝙蝠在一个点无限转向
                 { 
                  if(x+bx[d]>0&&x+bx[d]<=m&&y+by[d]>0&&y+by[d]<=n)
                   if(map[y+by[d]][x+bx[d]]!=1)
                    break;
                  d=z[t][d];
                  ha++;
                  if(ha>5)
                   break;
                 }
                if(ha>5)
                 break;
                x+=bx[d];
                y+=by[d];
                now++;
            }
        }
        dp[1][1]=1;
        for(i=1;i<=n;i++)
         for(j=1;j<=m;j++)
          {
          if(i==1&&j==1)
           continue;
          if(!map[i][j])
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
          }
        cout<<dp[n][m];
        return 0;
    }
    
    
    
  • 0
    @ 2016-09-22 21:47:29

    简直了,,,,,首先你要注意它的x不是你的 i,,,,,
    其次就是你要注意有这么一句话*若初始状态中蝙蝠与石柱重合,则认为蝙蝠在石柱上休息,不会动。*
    还有三种蝙蝠的转向,,,,,,
    尴尬
    ```C++
    #include <set>
    #include <map>
    #include <list>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <cctype>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cassert>
    #include <cstdlib>
    #include <cstring>
    #include <sstream>
    #include <iostream>
    #include <algorithm>
    #define maxn (100 + 5)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long int LLI;

    struct node {
    int x;
    int y;
    int dir;
    int val;
    } op[maxn];

    LLI dp[maxn * 2][maxn][maxn];
    int mar[maxn * 2][maxn][maxn];
    int m,n,p,b,cntp = 0;

    int main() {
    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);
    scanf("%d%d%d",&m,&n,&p);
    memset(mar,0,sizeof(mar));
    for(int i = 1; i <= p; i ++) {
    int px,py;
    scanf("%d%d",&py,&px);
    for(int j = 1; j < m + n; j ++) mar[j][px][py] = -1;
    }
    scanf("%d",&b);
    for(int i = 1; i <= b; i ++) {
    int px,py,pz,pp;
    scanf("%d%d%d%d",&py,&px,&pz,&pp);
    if(mar[1][px][py] == -1) continue;
    cntp ++;
    op[cntp].x = px;
    op[cntp].y = py;
    op[cntp].dir = pz;
    op[cntp].val = pp;
    }
    for(int i = 1; i < n + m; i ++) {
    for(int j = 1; j <= cntp; j++) {
    int px,py,cnt = 0;
    while(1) {
    if(cnt > 4) break;
    cnt ++;
    px = op[j].x;
    py = op[j].y;
    if(op[j].dir == 1) px --;
    if(op[j].dir == 2) py --;
    if(op[j].dir == 3) px ++;
    if(op[j].dir == 4) py ++;
    if(px <= 0 || px > n || py <= 0 || py > m || mar[i][px][py] == -1) {
    if(op[j].val == 1) op[j].dir = op[j].dir % 4 + 1;
    if(op[j].val == 2) op[j].dir = (op[j].dir + 1) % 4 + 1;
    if(op[j].val == 3) op[j].dir = (op[j].dir + 2) % 4 + 1;
    } else break;
    }
    if(cnt <= 4) {
    if(mar[i + 1][px][py] == 0) mar[i + 1][px][py] = 1;
    op[j].x = px;
    op[j].y = py;
    } else if(mar[i + 1][op[j].x][op[j].y] == 0) mar[i + 1][op[j].x][op[j].y] = 1;
    }
    }
    memset(dp,0,sizeof(dp));
    dp[1][1][1] = 1;
    for(int i = 1; i < m + n; i ++) {
    for(int j = 1; j <= n; j ++) {
    for(int k = 1; k <= m; k ++) {
    if(dp[i][j][k] == 0) continue;
    if(j + 1 <= n && mar[i + 1][j + 1][k] == 0) dp[i + 1][j + 1][k] += dp[i][j][k];
    if(k + 1 <= m && mar[i + 1][j][k + 1] == 0) dp[i + 1][j][k + 1] += dp[i][j][k];
    }
    }
    }
    printf("%lld\n",dp[m + n - 1][n][m]);
    return 0;
    }
    ```

  • 0
    @ 2012-10-19 11:47:09

    垃圾题目  描述不清

    MLGB 明明是先列再行

  • 0
    @ 2012-09-26 23:13:30

    我想死啊,找了一个多小时的错误........居然是 变量p没有读入.....

  • 0
    @ 2009-11-09 18:48:38

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    用小号交了15次才A啊。。我终于明白这题的通过率是整么搞出来的了。。

    题目描述的太垃圾了 我看样例才发现自己横纵坐标搞错

    晕死。。

    题目不难 抓住(n+m-1)就行了

    这样描述就是说去每个点的时间都是(x+y-1)

    先预处理一下蝙蝠的n+m-1步的情况 如果第t步到的(x,y)满足 x+y-1=t

    那那个点就不可以走到

    然后就是f:=f+f;

  • 0
    @ 2009-10-29 10:35:59

    坐标实在太恼人了!

  • 0
    @ 2009-10-22 19:12:01

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    ======================销魂的分割线=========================

    program v1175;

    var g:array[0..101,0..101] of boolean;

    f:array[0..101,0..101] of longint;

    u:array[0..10201,0..101,0..101] of boolean;

    i,j,k,n,m,xx,yy,a,b,x,y,r,p:longint;

    procedure fang;

    begin

    case a of

    1: begin

    xx:=-1;

    yy:=0;

    end;

    2: begin

    xx:=0;

    yy:=-1;

    end;

    3: begin

    xx:=1;

    yy:=0;

    end;

    4: begin

    xx:=0;

    yy:=1;

    end;

    end;

    end;

    begin

    readln(m,n);

    readln(p);

    fillchar(g,sizeof(g),false);

    for i:=1 to p do

    begin

    readln(y,x);

    g[x,y]:=true;

    end;

    for i:=0 to n+1 do

    begin

    g:=true;

    g:=true;

    end;

    for i:=0 to m+1 do

    begin

    g[0,i]:=true;

    g[n+1,i]:=true;

    end;

    readln(k);

    for j:=1 to k do

    begin

    readln(y,x,a,b);

    if g[x,y] then continue;

    u[1,x,y]:=true;

    fang;

    for i:=2 to n+m-1 do

    begin

    r:=0;

    while (g[x+xx,y+yy])and(r4 then a:=a mod 4;

    inc(r);

    fang;

    end;

    if r

  • 0
    @ 2009-10-18 08:56:19

    此题坐标把我弄晕了

  • 0
    @ 2009-10-05 16:00:57

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    我无语到家了

    我把 第二个认为是 向右转

    第三个 向后转

    Wa 了N次



    无语至极啊

    大家认真审题啊

  • 0
    @ 2009-10-05 11:06:48

    虽然是DP,但是预处理实在是烦........

  • 0
    @ 2009-08-11 18:03:30

    总算AC了

    注意:柱子上的蝙蝠永远不动!!

  • 0
    @ 2009-08-10 21:31:02

    其实还是蛮水的,第一次AC难度3。。就是长了点。。~~我还以为一开始跟蝙蝠重合就死,居然没事的~~搞的交多一次。。。。

    longint就行拉,,,我的方程弄到f[t,n]的。。然后每此t+,就模拟蝙蝠走~用两个数组。记录是否可到。。。。。。。

  • 0
    @ 2009-08-07 22:45:09

    编译通过...

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

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

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

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

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

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

    ├ 测试数据 07:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 08:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 09:答案错误...

     ├ 标准行输出

     ├ 错误行输出

    ├ 测试数据 10:答案错误...

     ├ 标准行输出

     ├ 错误行输出

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

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

    咦,怎么就错了4个呢?看看大家的题解先……

    糊涂啦!

    预处理:

    一个boolean表记录柱子所在的位置。

    一个boolean表记录人到该位置时,蝙蝠能否到这里。

    (我一开始就发觉方向不对劲,于是把1、2、3、4对应变成2、3、4、1了)

    (蝙蝠要转动多次才有路走也是早就考虑了。而完全被困也早就归到蝙蝠在柱子上的情况,不过该位置一定要加进上述的第二个boolean表)

    好像就差高精度没用了(现在是int64)

    到底是什么问题呀??

  • 0
    @ 2009-07-24 09:57:53

    晕死,方向搞错了,调了N久!

  • 0
    @ 2009-07-24 09:06:36

    这是什么题目啦,

    考察观察能力,方向都那变态>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?????????????????????????????????????????????????????????????

  • 0
    @ 2009-07-18 10:24:59

    因为一个小错误查了半天……

  • 0
    @ 2009-05-30 21:09:19

    晕死…… 打错一个字母 wa n次

    我 写 的 好 猥琐 啊,竟然 130 行 ……

  • 0
    @ 2009-02-06 23:21:41

    第八个点蝙蝠和人一开始就重合(1,1)的时候,但人不会死!!!!!!!!

    害我整了个小号,狂试!!!!

  • 0
    @ 2008-11-12 10:12:32

    预处理花了55分钟。。。

    dp用了5分钟……

    调试用了5分钟……

    恶心的预处理。。

  • 0
    @ 2008-11-10 12:59:46

    这道题是斜线的动规

    特别提示:蝙蝠的四周有可能都是柱子

信息

ID
1175
难度
7
分类
动态规划 点击显示
标签
(无)
递交数
667
已通过
121
通过率
18%
被复制
4
上传者