<>题目

<>双行道

时间限制: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分钟前调试程序,否则由于密集排队提交,可能查询不到编译结果 点击“调试”亦可保存代码 编程题可以使用本地编译器,此页面不记录跳出次数
思路:

* 想想,只要上下都是X,就堵住路了, 这种情况先检测出来,得到-1,否则至少有一条路
* 但凡出现了可以选择的情况:两条路里可以选择一条,即出现了平行宇宙的分裂,这种情况,当然是!概率翻倍,可走路数*2了
* 检测下一步可以走的选择数目,计算倍数,即可得到答案了。
其实懂思路了代码看不看都可以了,自己写着尝试一下才是正途,别看代码了。
放代码如下:
#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); }

技术
©2019-2020 Toolsou All rights reserved,
MyBatis 新增数据 成功 返回 自增主键ID值用C语言做很简单的飞机游戏苹果不送充填器耳机真为环保?可能还是为了赚钱吧一个名叫“讨火车”的小村子 终于把火车讨来了使用easyPOI导入Excel数据QT:清空指定文件夹内的所有文件及目录json反斜杠问题3种Python数据结构,13种创建方法,这个总结,超赞!访客手机抓取方法改主意!特斯拉开始向欧洲市场交付中国造Model 3