2020春美団筆記試験問題1コース


タイトル
にじゅうどうろ
時間制限:C/C++言語1000 MS;その他言語3000 MSメモリ制限:C/C++言語65536 KB;その他の言語589824 KB
タイトルの説明:
(1,1)の位置、すなわち左上隅に位置する2*nのメッシュがあり、左上隅から右下隅、すなわち(2,n)の位置まで歩きたいと考えています.毎回、彼は3つの操作のうちの1つを行うことができます.
1.      ,  (x,y) (x,y+1);
2.        , ,    (2,y)       (1,y+1);
3.        , ,    (1,y)       (2,y+1);

問題はもちろんこんなに簡単ではありません.この2*nの格子の中には、一部の格子に障害物があり、彼は障害物に止まることができません.もちろん、グリッドを出ることもできません.何種類の異なるルートで着くことができますか(2,n).
入力入力の最初の行には、グリッドの長さを表す正の整数nが1つしか含まれていません.(1<=n<=50)次は2行あり、各行にn文字あり、「X」は障害物を表し、「.」代表は滞在できます.
出力到達可能なルートがない場合は-1を出力し、そうでない場合はシナリオ数を出力します.
サンプル入力
5
..X.X
XX...

サンプル出力
2

ルール#ルール#
          10       ,          ,          
  “  ”      
            ,          

考え方:
  • 考えてみると、 X, ,このような状況が先に検出され、-1
  • が得られた.
  • しかし、選択できる状況が現れた:2つの道の中で1つを選ぶことができて、つまり が現れて、このような状況は、もちろんです!確率は2倍、 *2
  • 次のステップで歩ける選択数を検出し、倍数を計算すると、答えが得られます.

  • 実は考えがわかりました.コードを見ても見なくてもいいです.コードを見ないでください.コードを次のように配置します.
    #include 
    #include 
    
    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
    ",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); }