2020春季美团笔试题1 双行道

题目

双行道

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:

有一个2*n的网格,有一个人位于(1,1)的位置,即左上角,他希望从左上角走到右下角,即(2,n)的位置。在每一次,他可以进行三种操作中的一种:

1. 向右走一格,即从(x,y)(x,y+1);
2. 向上右方走一格,即,如果他在(2,y)的位置可以走到(1,y+1);
3. 向下右方走一格,即,如果他在(1,y)的位置可以走到(2,y+1);

问题当然不会这么简单,在这2*n的格子中,有一部分格子上有障碍物,他不能停在障碍物上,当然也不能走出网格,请问他有多少种不同的路线可以到达(2,n)。

输入
输入第一行仅包含一个正整数n,表示网格的长度。(1<=n<=50)
接下来有2行,每行有n个字符,“X”代表障碍物,“.”代表可以停留。

输出
如果没有可以到达的路线则输出-1,否则输出方案数量。

样例输入

5
..X.X
XX...

样例输出

2

规则

请尽量在全场考试结束10分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果
点击“调试”亦可保存代码
编程题可以使用本地编译器,此页面不记录跳出次数

思路:

  1. 想想,只要上下都是X,就堵住路了, 这种情况先检测出来,得到-1,否则至少有一条路
  2. 但凡出现了可以选择的情况:两条路里可以选择一条,即出现了平行宇宙的分裂,这种情况,当然是!概率翻倍,可走路数*2了
  3. 检测下一步可以走的选择数目,计算倍数,即可得到答案了。

其实懂思路了代码看不看都可以了,自己写着尝试一下才是正途,别看代码了。
放代码如下:

#include <stdio.h>
#include <stdlib.h>

void right(int *x,int *y)
   { *x=*x;
    *y=*y+1;}

void rightUp(int *x,int *y)
{*x=1;
    *y=*y+1;}

void rightDown(int *x,int *y)
   {*x=2;
    *y=*y+1;}

int path[1][50];
int main(){
    int length = 0;
    char grid[2][50];
    int i=0;
    int j =0;
    for(i=0;i<2;i++){
        for(j=0;j<50;j++){
             grid[i][j]=0;
        }
    }
    scanf("%d",&length);
    for(i=0;i<2;i++){
          scanf("%s",grid[i]);
        //printf("%s\n",grid[i]);
    }
    int walk = 1;
    for(i=0;i<50;i++){
        if(grid[0][i]==0){
            break;
        }
        if(grid[0][i]=='X'&&grid[1][i]=='X'){
            printf("-1");
            exit(0);
        }
        if(grid[0][i]=='.'&&grid[1][i]=='.'){
            walk=walk*2;
        }
    }
    printf("%d",walk);


}
发布了140 篇原创文章 · 获赞 114 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/qinglingLS/article/details/104868675