HDU 1728迷宮から脱出(簡単dfs)

3757 ワード

迷宮から逃げる
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11863    Accepted Submission(s): 2858
Problem Description
mを1つ与える× n(m行、n列)の迷路、迷路の中には2つの位置があり、gloriaは迷路の1つの位置から別の位置に行きたいと思っています.もちろん迷路の中には空き地があり、gloriaは通り抜けることができます.障害がある場所もあります.彼女は迂回しなければなりません.迷路の1つの位置から、それに隣接する4つの位置までしか歩けません.もちろん、歩いているうちにgloriaは迷路の外に行けません.頭が痛いのは、gloriaは方向感覚のない人なので、彼女は歩いている間に、あまり曲がってはいけません.そうしないと、彼女は気絶します.与えられた2つの位置は空き地であると仮定し,初期にgloriaが向いている方向は未定であり,彼女は4つの方向のいずれかを選択して出発することができ,1回のカーブではない.gloriaは一つの位置から別の位置に行けますか?
 
Input
第1の挙動は整数t(1≦t≦100)であり、試験データの個数を表し、次にt群の試験データであり、各群の試験データにおいて、
第1の動作は2つの整数m,n(1≦m,n≦100)であり、それぞれ迷路の行数と列数を表し、次にm行であり、各行はn文字を含み、文字'.'はその位置が空き地であることを示し、文字'*'はその位置が障害であることを示し、入力データにはこの2つの文字しかなく、各テストデータの最後の動作は5つの整数k,x
1, y
1, x
2, y
2 (1 ≤ k ≤ 10, 1 ≤ x
1, x
2 ≤ n, 1 ≤ y
1, y
2 ≦m)で、kはgloriaが最も回転可能な曲げ数を表し、(x
1, y
1), (x
2, y
2)は、xの2つの位置を表す
1,x
2対応列、y
1, y
2対応する行.
 
Output
各テストデータのセットは1行に対応し、gloriaが1つの位置から別の位置に移動できれば「yes」を出力し、そうでなければ「no」を出力する.
 
Sample Input

   
   
   
   
2 5 5 ...** *.**. ..... ..... *.... 1 1 1 1 3 5 5 ...** *.**. ..... ..... *.... 2 1 1 1 3

 
Sample Output

   
   
   
   
no yes

 
Source
「ネット新恩普杯」杭州電子科学技術大学プログラム設計招待試合
 
テーマ:
n*nの図をあげて、kをあげて、起点と終点をあげます.回転方向K回以内に始点から終点に着くかどうか聞いてみます.問題が入力した座標に少し穴があることに注意してください.
     解題構想:比較的簡単なdfsで,開始方向を−1に設定し,0,1,2,3を4方向に表す.ステアリングステップ数に1を加えると、各点に最小のステアリング回数が記録される.
 迷宮から逃げる
ACコード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int m, n, ex, ey, k, p[105][105];
//p[x][y]     
char map1[105][105];
int x_move[4] = {-1, 0, 1, 0};
int y_move[4] = {0, 1, 0, -1};
bool flag;

void dfs (int x, int y, int dir) //dir     
{
    if (x == ex && y == ey)
    {
        if (p[x][y] <= k)
            flag = true;
        return ;
    }
    //x !=ex && y != ey            ,         
    if ((x !=ex && y != ey && p[x][y] == k)||p[x][y]>k)
        return ;
    for (int i = 0; i < 4; i++)
    {
        int tx = x + x_move[i];
        int ty = y + y_move[i];
        if (tx < 0 || tx >= m|| ty < 0 || ty >= n)  //    
            continue;
        //         
        if (map1[tx][ty] == '*' || p[tx][ty] < p[x][y])  //           
            continue;
        if (dir != -1 && i != dir && p[tx][ty] == p[x][y] )
            continue;          //    
        if (dir != -1 && i != dir)
            p[tx][ty]=p[x][y]+1; //        +1
        else p[tx][ty] = p[x][y];
        dfs (tx, ty, i);
        if (flag) return ;
    }
}

int main()
{
    int t,i,j,sx,sy; //sx, sy   
    scanf ("%d", &t);
    while (t--)
    {
        scanf("%d%d",&m,&n);
        for(i=0;i<m;i++)
            scanf ("%s",map1[i]);
        scanf("%d%d%d%d%d",&k,&sy,&sx,&ey,&ex);
        sx--,sy--,ex--,ey--;  // 0    ,     1  
        for (i = 0; i < m; i++)
            for (j = 0; j < n; j++)
                p[i][j] = 10005; //          
        p[sx][sy] = 0; //        
        flag = false;
        dfs (sx, sy, -1); //          ,      -1
        if (flag) puts ("yes");
        else puts ("no");
    }
    return 0;
}

//15MS 284K