HDU 1010 Tempter of the Bone
这题如果是神搜的一基本题目,每次都向四个方向神搜就行了,不过要考虑剪枝,要用奇偶剪枝,否则TLE,还有用一个标记f,标记当前是否已找到来剪枝。如果还想减少时间就可以在输入时做一个标记,看当前有多少个可以走的点,如果可以走的点小于总时间t那么肯定是NO,这样要减少很多饿。。。。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int n,m,t,sx,sy,ex,ey,f;
int maz[10][10],des[10][10];
void DFS( int y,int x,int num )
{
if( des[y][x] ||f|| maz[y][x] == 'X'||num > ( n * m ) )
return ;
if( maz[y][x] == 'D'&&num == t )
{
f = 1;//看是否找到
return ;
}
if( abs( t - num ) % 2 != abs(abs( y - ey ) + abs( x - ex )) % 2 )
return ;//奇偶剪枝
des[y][x] = 1;
DFS( y - 1,x,num+1 );
DFS( y,x - 1, num+1 );
DFS( y + 1, x, num+1 );
DFS( y,x + 1, num + 1 );
des[y][x] = 0;
}
int main( )
{
while( scanf( "%d%d%d%*c",&n,&m,&t ),n||m||t )
{
int ans = 0;
memset( des,0,sizeof( des ) );
for( int i = 0; i < 10; ++i )
for( int j = 0; j < 10; ++j )
maz[i][j] = 'X';
for( int i = 1; i <= n; ++i )
{
for( int j = 1; j <= m; ++j )
{
scanf( "%c",&maz[i][j] );
if( maz[i][j] == 'S' )
sy = i,sx = j;
else if( maz[i][j] == 'D' )
ey = i,ex = j;
else if(maz[i][j]=='.')
ans++;//标记当前可走的点
}
getchar();
}
f = 0;
if( ans < t )
printf("NO\n");
else
{
DFS( sy,sx,0 );
puts( f ? "YES":"NO" );
}
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号