zoukankan      html  css  js  c++  java
  • codevs——T1267 老鼠的旅行

     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    You are a mouse that lives in a cage in a large laboratory.

    你是一只生活在笼子里的实验室老鼠。

    The laboratory is composed of one rectangular grid of square cages, with a total of R rows and C columns of cages (1 ≤ R,C ≤ 25).

    实验室是一个R行C列的格子矩阵(1 ≤ R,C ≤ 25). 每个格子是一个笼子. (尼玛还要我活么……)

    To get your exercise, the laboratory owners allow you to move between cages.

    为了让你锻炼身体,实验室管理员允许你在笼子之间移动。

    You can move between cages either by moving right between two adjacent cages in the same row, or by moving down between two adjacent cages in the same column.

    你只能向右和向下移动。

    You cannot move diagonally, left or up.

    你不能斜着移动,也不能向上和向左移动。

    Your cage is in one corner of the laboratory, which has the label (1,1) (to indicate top-most row, left-most column).

    你所在的笼子是实验室的左上角,标记为(1,1)

    You would like to visit your brother who lives in the cage labelled (R,C) (bottom-most row, right-most column), which is in the other corner diagonally.

    你想去右下角的笼子(R,C)里找你的女朋友(尼玛老鼠也有女盆友么!!!)

    However, there are some cages which you cannot pass through, since they contain cats.

    但是有一些笼子是不能经过的,因为里面有猫(谁说老鼠怕猫么,还有,管理员有毛病么……)

    Your brother, who loves numbers, would like to know how many different paths there are between your cage and his that do not pass through any cat cage. Write a program to compute this number of cat-free paths.

    你女朋友很爱数学,她想要知道有多少条不同的路径可以从你的笼子到达她的笼子。写一个程序来计算吧。(这样的女朋友不要也罢……)

    输入描述 Input Description

    The first line of input contains two integers R and C, separated by one space representing the number of rows and columns (respectively). On the second line of input is the integer K, the number of cages that contain cats. The next K lines each contain the row and column positions (in that order) for a cage that contains a cat. None of the K cat cages are repeated, and all cages are valid positions. Note also that (1,1) and (R,C) will not be cat cages.

    第一行包含2个整数R和C,第二行一个整数K,代表包含猫的笼子的个数,接下来K行包含K个不同的位置信息,代表K个包含猫的笼子的位置信息,注意(1,1)和(R,C)这两个位置是不会有猫的, 否则出题者就没法活了……

    输出描述 Output Description

    Output the non-negative integer value representing the number of paths between your cage at position (1,1) and your brother’s cage at position (R,C). You can assume the output will be strictly less than 1 000 000 000.

    输出一个非负整数代表你可以去你女朋友笼子里和她啪啪啪的路径数目,你可以假设这个输出会严格小于1,000,000,000。

    样例输入 Sample Input

    样例输入 1:

    2 3

    1

    2 1

    样例输入 2:

    3 4

    3

    2 3

    2 1

    1 4

    样例输出 Sample Output

    样例输出 1: 2

    样例输出 2: 1

    数据范围及提示 Data Size & Hint
     

    分类标签 Tags 点此展开 

     
     
     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int r,c,k,ans,x,y;
     7 int map[30][30];
     8 int fx[2]={0,1};
     9 int fy[2]={1,0};
    10 
    11 void DFS(int x,int y)
    12 {
    13     if(x==r&&y==c)
    14     {
    15         ans++;
    16         return ;
    17     }
    18     for(int i=0;i<2;i++)
    19     {
    20         int xx=x+fx[i],yy=y+fy[i];
    21         if(!map[xx][yy]&&xx<=r&&yy<=c&&xx>0&&yy>0)
    22         {
    23             map[xx][yy]++;
    24             DFS(xx,yy);
    25             map[xx][yy]--;
    26         }
    27     }
    28 }
    29 
    30 int main()
    31 {
    32     scanf("%d%d%d",&r,&c,&k);
    33     for(int i=1;i<=k;i++)
    34     {
    35         scanf("%d%d",&x,&y);
    36         map[x][y]=2;
    37     }
    38     map[1][1]++;
    39     DFS(1,1);
    40     printf("%d",ans);
    41     return 0;
    42 }
    TLE了一个点的DFS~~

    正解棋盘DP

     1 #include <algorithm>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int r,c,k,ans,x,y;
     7 int map[30][30],f[30][30];
     8 
     9 int main()
    10 {
    11     scanf("%d%d%d",&r,&c,&k);
    12     for(int i=1;i<=k;i++)
    13     {
    14         scanf("%d%d",&x,&y);
    15         map[x][y]=1;
    16     }
    17     f[1][1]=1;//从(1,1)走,开始最少有一个方案 
    18     for(int i=1;i<=r;i++)
    19         for(int j=1;j<=c;j++)
    20         {
    21             if(map[i][j]) f[i][j]=0;
    22             else f[i][j]+=f[i-1][j]+f[i][j-1];
    23         }
    24     printf("%d",f[r][c]);
    25     return 0;
    26 }
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    android代码签名和混乱的包装
    C# 中对WinForm窗体中的控件快速设置TableIndex次序
    常用的Oracle数据库语句 (待更新完毕)
    [转] C# 键盘中的按键对应的KeyValue
    Oracle 数据库中日期时间的插入操作
    C#操作Excel,对Sheet插入次序的控制 (有待完善)
    Simditor图片上传
    文件类似的推理 -- 超级本征值(super feature)
    leetcode 名单 Insertion Sort List
    汉高澳大利亚sinox2014电影播放flash最好的办法是安装游戏windows文本firefox
  • 原文地址:https://www.cnblogs.com/Shy-key/p/6740710.html
Copyright © 2011-2022 走看看