ブルーブリッジカップ - 2017 C ++質問の最初のセット:迷路[列挙]

I、題し

惑星Xは、丘の中腹の遊び場上に構築された迷路です。
これは、その相互接続された10×10の小さな部屋です。

私は部屋の床の上に手紙をたくさん読んで。
私たちは、その後、プレイヤーが上り坂地位に向かう方向であることを前提としています
Lは部屋の左側が行き表し、
Rは右側の部屋に行き表し、
Uは部屋が上り坂方向に行ってきました表し、
Dは、部屋が下り坂の方向を行ってきました表します。

少し怠惰な住民X惑星は、私が面倒だと思うしたくありません。
彼らは運のようなゲームをプレイすることを好みます。このゲームは、あまりにも!

当初、100人の選手が小さな部屋にヘリコプターを置きます。
プレイヤーは、アルファベット地に移動する必要があります。

迷路マップを次のように
------------
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
------------

あなたは数学を行い、最終的に、どのように多くの選手が迷路?外となりますしてください 
円の内側ではなく。

余分な内容を記入していない、迷路の外の選手の数を表す整数を提出してください。

あなたがゲームのルールを理解していない場合は、簡略図解説4x4の迷路を見ることができます:


第二に、アイデア

ここでは、直接に戻って場所を確認するために、それぞれの場所を列挙することができます。

限り境界としてさらに迷路、1の数のうちマトリックスより。

第三に、問題解決

#include <iostream>
using namespace std;
int ans=0;
int visit[11][11];
char maze[11][11]={"UDDLUULRUL","UURLLLRRRU","RRUURLDLRD","RUDDDDUUUU","URUDLLRRUU",
                   "DURLRLDLRL","ULLURLLRDU","RDLULLRDDD","UUDDUDUDLL","ULRDLUURRR"};
int f(int x,int y)
{
    while(1)
    {
        if(x<0 || y<0 || x>9 || y>9)
        //走出迷宫的条件。
        {
            ans++;
            break;
        }
        if(visit[x][y])
        //路径已经浏览过了
        {
            break;
        }
        //开始浏览新的路径。
        visit[x][y]=1;
        switch (maze[x][y])
        {
            case 'U':x--;break;
            case 'D':x++;break;
            case 'L':y--;break;
            case 'R':y++;break;
        }
    }
}
int main()
{
    for (int i=0;i<10;i++)
    {
        for (int j=0;j<10;j++)
        {
            memset(visit,0, sizeof(visit));
            f(i,j);
        }
    }
    cout << ans << endl;
    return 0;
}

 

第四に、結果

31

プロセスは、終了コードを終了0

公開された57元の記事 ウォンの賞賛9 ビュー3580

おすすめ

転載: blog.csdn.net/Jayphone17/article/details/104243063