p1671.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 76 行

CPP
76
字号
#include <stdio.h>

#define MAX     8

const   int dx [4] = { 0 , 0 , -1 , 1 };
const   int dy [4] = { -1 , 1 , 0 , 0 };

struct  TNode {
        int     x , y;
}       Data [MAX * MAX];

int     Start , Goal;
int     H , W , NumberPoint , map [MAX] [MAX] , dis [MAX * MAX] [MAX * MAX];
int     min [MAX] [MAX] , MinTime [MAX * MAX];
bool    mk [MAX * MAX];

void    DFS ( int x , int y , int cost = 0 )
{
        if ( x < 0 || x == H || y < 0 || y == W ) return;
        if ( cost > 6 || cost >= min [x] [y] ) return;
        min [x] [y] = cost;
        if ( cost && map [x] [y] != 1 ) return;
        for ( int i = 0; i < 4; i ++ ) DFS ( x + dx [i] , y + dy [i] , cost + 1 );
}

bool    init ()
{
        scanf ( "%d%d" , &W , &H ); if ( W == 0 ) return false;
        NumberPoint = 0;
        int     i , j , k;
        for ( i = 0; i < H; i ++ )
                for ( j = 0; j < W; j ++ ) {
                        scanf ( "%d" , &map [i] [j] );
                        if ( map [i] [j] <= 1 ) continue;
                        if ( map [i] [j] == 2 ) Start = NumberPoint;
                        if ( map [i] [j] == 3 ) Goal = NumberPoint;
                        Data [NumberPoint].x = i , Data [NumberPoint ++].y = j;
                }

        for ( i = 0; i < NumberPoint; i ++ ) {
                for ( j = 0; j < H; j ++ )
                        for ( k = 0; k < W; k ++ ) min [j] [k] = 10;
                DFS ( Data [i].x , Data [i].y );
                for ( j = 0; j < NumberPoint; j ++ )
                        dis [i] [j] = min [Data [j].x] [Data [j].y];
        }
        return true;
}

void    Work ()
{
        int     i , j , k;
        for ( i = 0; i < NumberPoint; i ++ ) mk [i] = false , MinTime [i] = 100000;
        MinTime [Start] = 0;
        for ( i = 0; i < NumberPoint; i ++ ) {
                for ( k = -1 , j = 0; j < NumberPoint; j ++ ) if ( !mk [j] )
                        if ( k == -1 || MinTime [j] < MinTime [k] ) k = j;
                if ( MinTime [k] == 100000 ) break;
                mk [k] = true;
                if ( k == Goal ) {
                        printf ( "%d\n" , MinTime [k] );
                        return;
                }
                for ( j = 0; j < NumberPoint; j ++ ) if ( !mk [j] && dis [k] [j] < 6 )
                        if ( MinTime [k] + dis [k] [j] < MinTime [j] )
                                MinTime [j] = MinTime [k] + dis [k] [j];
        }
        printf ( "-1\n" );
        
}

main ()
{
        while ( init () ) Work ();
}
 

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?