迷宫最短路径
菜鸟生成记(28)
#include< stdio. h>
#include< string. h>
#define N 1001
struct st{
int x;
int y;
} s[ N ] , s_min[ N ] ;
int Map[ N ] [ N ] ;
int step_map[ N ] [ N ] ;
int flag[ N ] [ N ] ;
int next1[ 4 ] [ 2 ] = { { 1 , 0 } , { 0 , 1 } , { - 1 , 0 } , { 0 , - 1 } } ;
int n, m, k= 1 ;
int step_min= N ;
void min1 ( )
{
memset ( s_min, 0 , sizeof ( s_min) ) ;
for ( int i= 0 ; i< step_min; i++ )
{
s_min[ i] = s[ i] ;
}
}
void input ( )
{
for ( int i= 0 ; i< step_min; i++ )
{
int x= s_min[ i] . x;
int y= s_min[ i] . y;
step_map[ x] [ y] = 1 ;
}
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= 1 ; j<= m; j++ )
{
printf ( "%d " , step_map[ i] [ j] ) ;
}
printf ( "\n" ) ;
}
}
void dsf ( int x, int y, int step)
{
if ( x== n&& y== m)
{
if ( step< step_min)
{
step_min= step;
min1 ( ) ;
}
return ;
}
int nx, ny;
for ( int i= 0 ; i< 4 ; i++ )
{
nx= x+ next1[ i] [ 0 ] ;
ny= y+ next1[ i] [ 1 ] ;
if ( nx<= n&& ny<= m)
if ( flag[ nx] [ ny] == 0 && Map[ nx] [ ny] == 1 )
{
flag[ nx] [ ny] = 1 ;
s[ k] . x= nx;
s[ k++ ] . y= ny;
dsf ( nx, ny, k+ 1 ) ;
flag[ nx] [ ny] = 0 ;
k-- ;
}
}
}
int main ( )
{
memset ( Map, 0 , sizeof ( Map) ) ;
memset ( flag, 0 , sizeof ( flag) ) ;
scanf ( "%d%d" , & n, & m) ;
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= 1 ; j<= m; j++ )
{
scanf ( "%d" , & Map[ i] [ j] ) ;
}
}
dsf ( 1 , 1 , 0 ) ;
input ( ) ;
return 0 ;
}