您的位置:首页 > 其它

hdoj 1010 Tempter of the Bone

2015-08-16 20:11 441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

这个题目主要考察深搜,其中用到了几个比较简单的剪枝技巧:

1.起点到终点的曼哈顿距离与时间t的奇偶性要相同,否则直接pass

2.路径上的任一点到终点的曼哈顿距离要不大于t,否则的话无论如何也无法到达终点

3.整个地图里的”.“的个数要大于t。显然如果”.“的个数大于t,就算把”.“都走完也没到开门的时间,只能挂掉了。(这个本以为没啥用,于是一直TLE。到最后百度一下,发现就是缺了这个,加上以后就过了)

代码如下

#include <iostream>
#include <string>
#include <iomanip>
#include <stack>
using namespace std;
int si,sj,ei,ej;
int f[4]={1,-1,0,0},g[4]={0,0,1,-1};//
int abst(const int&a)
{
if(a<0)
return -a;
return a;
}
struct node
{
bool visit;
int short_dis;
int type;
};
stack<node> route;
node p[9][9];
void init(int a,int b)
{
for(int i(0);i<=b;i++)
for(int j(0);j<=a;j++)
p[i][j].visit = 0,p[i][j].short_dis = abst(ei-i)+abst(ej-j);
for(int i(0);i<=b+1;i++)
p[i][0].type = 0;
for(int i(0);i<=b+1;i++)
p[i][a+1].type=0;
for(int i(0);i<=a+1;i++)
p[0][i].type=0;
for(int i(0);i<=a+1;i++)
p[b+1][i].type=0;
p[si][sj].visit = 1;
}
bool legal(const node& x)
{
return !x.visit&&(x.type!=0);
}
bool dfs(const int&x,const int&y,const int&t)
{
if(t==0)
if(p[x][y].type == -1)
return 1;
else
return 0;
if(p[x][y].short_dis%2!=t%2)
return 0;
if(t<p[x][y].short_dis)
return 0;
bool flag = 0;
for(int i(0);i<4;i++)
{
if(legal(p[x+f[i]][y+g[i]]))
{
p[x+f[i]][y+g[i]].visit = 1;
flag = dfs(x+f[i],y+g[i],t-1);
p[x+f[i]][y+g[i]].visit = 0;
if(flag)
return 1;
}
}
return 0;
}
int main()
{
int a,b,t;
char type;
int remain;
while(cin >>a>>b>>t&&a&&b&&t)
{
remain = 0;
for(int i(1);i<=b;i++)
for(int j(1);j<=a;j++)
{
cin >> type;
if(type =='S')
{
si = i;
sj = j;
}
else
if(type == 'D')
{
ei = i;
ej = j;
}
if(type=='X')
p[i][j].type = 0;
else
if(type=='.'){
p[i][j].type = 1;
remain++;
}
else
if(type == 'D')
p[i][j].type = -1;
else
p[i][j].type = 1;
}
if(remain+1<t){
cout << "NO"<<endl;
continue;
}
init(a,b);
if(dfs(si,sj,t))
cout << "YES"<<endl;
else
cout << "NO"<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: