题目
双行道
时间限制: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);
}