hdu 1010 Tempter of the Bone
传说中的奇偶剪枝,但是这题的数据,在dfs前判断一下,可以变得很快。
171MS:
#include <math.h>
#include <iostream>
using namespace std;
#define MAX 10
const int dir[4][2]= {{0,1},{1,0},{-1,0},{0,-1}};
int N,M,T,di,dj;
char maze[MAX][MAX];
bool survive,visited[MAX][MAX];
void dfs(int i,int j,int t)
{
if(survive==true) return;
if(t==T)
{
if( i==di && j==dj )
survive=true;
return ;
}
else if( i==di && j==dj ) return;
int x,y,k,min=fabs(double(di-i) )+fabs(double(dj-j));
if( min > T - t ) return; //最快的时间都不能走到,肯定完蛋了
if( (T-t-min) & 1 ) return; // if(min % 2 != (T-t) % 2)//奇偶剪枝
for(k=0; k<4; k++)
{
x=i+dir[k][0];
y=j+dir[k][1];
if( x<0 || x>=N || y<0 || y>=M) continue;
if( !visited[x][y] && maze[x][y]!='X' )
{
visited[x][y]=true;
dfs(x,y,t+1);
visited[x][y]=false;
}
}
}
int main()
{
while(scanf("%d %d %d",&N,&M,&T) && (N||M||T) )
{
getchar();
int i,j,si,sj,xx=0;
for(i=0; i<N; i++)
{
for(j=0; j<M; j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S')
{
si=i;
sj=j;
}
else if(maze[i][j]=='D')
{
di=i;
dj=j;
}
else if(maze[i][j]=='X' )
xx++;
}
getchar();
}
//有这个判断,这题边剪枝都不用了
if( N*M - xx -1< T)
{
printf("NO\n");
continue;
}
memset(visited,false,sizeof(visited));
survive=false;
visited[si][sj]=true;
dfs(si,sj,0);
if( survive ) printf("YES\n");
else printf("NO\n");
}
}
//************************************************************************************************
同学问网上牛人拿的0MS的代码,超强!!!
#include <stdio.h>
#include <string.h>
const int dir[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};
const int MAX=8;
int n,m;
char map[MAX][MAX];
int dx,dy;
struct Struct_Q
{
int x,y;
} q[1000000];
int used[MAX][MAX];
int vabs(int x)
{
return x<0?-x:x;
}
int dis(int x,int y)
{
return vabs(x)+vabs(y);
}
int BFS(int x,int y)
{
int tx,ty,i,f=-1,r=0;
memset(used,0,sizeof(used));
used[x][y]=1;
q[0].x=x;
q[0].y=y;
while(f!=r)
{
f++;
x=q[f].x;
y=q[f].y;
for(i=0; i<4; i++)
{
tx=x+dir[i][0];
ty=y+dir[i][1];
if(tx==dx&&ty==dy)return 1;
if(tx<0||tx>=n||ty<0||ty>=m||used[tx][ty])continue;
if(map[tx][ty]=='X')continue;
used[tx][ty]=1;
r++;
q[r].x=tx;
q[r].y=ty;
}
}
return 0;
}
int able(int x,int y)
{
memset(used,0,sizeof(used));
int i,f=-1,r=0,tx,ty,cnt=0;
q[0].x=x;
q[0].y=y;
used[x][y]=1;
while(f!=r)
{
f++;
x=q[f].x;
y=q[f].y;
for(i=0; i<4; i++)
{
tx=dir[i][0]+x;
ty=dir[i][1]+y;
if(tx<0||tx>=n||ty<0||ty>=m||used[tx][ty])continue;
if(map[tx][ty]=='X')continue;
cnt++;
used[tx][ty]=1;
r++;
q[r].x=tx;
q[r].y=ty;
}
}
return cnt;
}
int DFS(int x,int y,int t)
{
int tx,ty,i;
if(t==0)
{
return x==dx&&y==dy;
}
if(able(x,y)<t)return 0;
if(BFS(x,y)==0)return 0;
if(dis(x-dx,y-dy)>t)return 0;
for(i=0; i<4; i++)
{
tx=x+dir[i][0];
ty=dir[i][1]+y;
if(tx<0||tx>=n||ty<0||ty>=m)continue;
if(map[tx][ty]=='X')continue;
map[tx][ty]='X';
if(DFS(tx,ty,t-1))return 1;
map[tx][ty]='.';
}
return 0;
}
int main()
{
int T;
int i,j,sx,sy;
while(scanf("%d%d%d",&n,&m,&T)!=EOF)
{
if(!n&&!m&&!T)break;
for(i=0; i<n; i++)
{
scanf("%s",map[i]);
for(j=0; j<m; j++)
{
if(map[i][j]=='S')
{
sx=i;
sy=j;
}
else if(map[i][j]=='D')
{
dx=i;
dy=j;
}
}
}
map[sx][sy]='X';
if((vabs(sx-dx)+vabs(sy-dy))%2!=T%2)
{
puts("NO");
continue;
}
if(dis(sx-dx,sy-dy)>T)
{
puts("NO");
continue;
}
if(BFS(sx,sy)==0)
{
puts("NO");
continue;
}
if(DFS(sx,sy,T)) puts("YES");
else puts("NO");
}
return 0;
}
浙公网安备 33010602011771号