您的位置:首页 > 其它

hdu1010 Tempter of the Bone

2011-07-26 10:40 288 查看
题目:hdu1010 tzc1221

方法:dfs

思想:由于本题中规定只有在固定时刻到达目的点才能逃脱,

不能提早,更不能延迟,故不能用bfs。可以用dfs找出所有情况,

若有可行解,直接返回即可。本题比较郁闷的是,在tzc上将方向

数组int dir[4][2]稍微变动两下,就会超时。这也是今后出现TLE时

该考虑的重要的一点吧,可以作为经验教训。

代码:

#include <iostream>
#include <stdlib.h>
using namespace std;
char map[10][10];
int n,m,t;
int dx,dy;
bool flag;
//int dir[4][2]={-1,0,0,-1,1,0,0,1};
//本题用上面的数组超时,下面的数组AC,在今后
//遇到相似问题,应该考虑改动遍历方向数组。
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int i,int j,int step)
{
if(i==dx&&j==dy&&step==t)flag=true;
if(step>t)return;
if(flag)return;//如果找到符合题意的就返回
if((t-step)%2!=(abs(dx-i)+abs(dy-j))%2)return;//如果奇偶性不同就返回
for(int u=0;u<4;u++)
{
int x=i+dir[u][0];
int y=j+dir[u][1];
if(x>=0&&x<n&&y>=0&&y<m)
{
if(map[x][y]!='X')
{
map[x][y]='X';
dfs(x,y,step+1);
map[x][y]='.';
}
}
}
}
int main(int argc, char *argv[])
{
//freopen("hdu1010in.txt","r",stdin);
while(cin>>n>>m>>t)
{
if(n==0&&m==0&&t==0)break;
int i,j,k=0;
int x,y;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S'){x=i,y=j;map[i][j]='X';}
else if(map[i][j]=='D'){dx=i,dy=j;k++;}
else if(map[i][j]=='.')k++;
}
if(k<t){printf("NO\n");continue;}
flag=false;
dfs(x,y,0);
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: