您的位置:首页 > 其它

hdu1010 Tempter of the Bone (DFS)

2013-03-28 19:56 417 查看
加入奇偶剪枝和最短路剪枝后仍然无限TLE..啊啊啊

求大神解惑 ORZ

#include<iostream>

#define M 8
#define N 8
#define T 50

#define EB 0
#define B 1
#define D 2
#define K 4
char map
[M];
int n,m,t;
int si,sj;
int ei,ej;
int nx;
char tm;
int move[K][2]={{-1,0},{1,0},{0,1},{0,-1}};

bool dfs(int x,int y,int step);

bool DFS()
{
//char tmap
[M];
//memcpy(tmap,map,sizeof(map));
map[si][sj]='X';
return dfs(si,sj,-1);

}

bool dfs(int x,int y,int step)
{

step++;
//	t--;
if((t-step)<0){
return false;
}

int r=abs(ej-y)+abs(ei-x)-(t-step);
if(r>0||(abs(r)&1!=0)){

return false;
}
if(map[x][y]=='D'){
if(step<t){
return false;
}else if(step==t){
return true;
}
}

int nx,ny;
bool res;

for(int i=0;i!=K;i++){
nx=x+move[i][1];
ny=y+move[i][0];
if(nx<=m&&nx>=0&&ny<=n&&ny>=0&&map[nx][ny]!='X'){
map[x][y]='X';
res=dfs(nx,ny ,step);
if(res==true){
return res;
}
map[x][y]='.';
}
}
return false;
}

int main()
{
while (std::cin>>n>>m>>t&&(m!=0||n!=0||t!=0))
{
for(int i=0;i!=n;i++){
for(int j=0;j!=m;j++){
std::cin>>tm;
if(tm=='S'){
si=i,sj=j;
}else if(tm=='D'){
ei=i,ej=j;
}else if(tm=='X'){
nx++;
}
map[i][j]=tm;
}
}
if((n*m-nx)<t){
std::cout<<"NO"<<std::endl;
}else{
//..	t++;
if(DFS()){
std::cout<<"YES"<<std::endl;
}else{
std::cout<<"NO"<<std::endl;
}
}
nx=0;
memset(map,0,sizeof(map));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: