hdoj1010
来源:互联网 发布:苹果windows系统黑屏 编辑:程序博客网 时间:2024/06/10 07:54
一开始以为是bfs!!!
#include<iostream>
#include<math.h>
using namespace std;
char map[10][10];
int n,m,t;
int si,sj,ei,ej;//开始和结束的坐标
int wal,flag;
int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int x,int y,int ut){//ut表示已经用的可用时间!
if(x>n||y>m||x<=0||y<=0) return;
if(ut==t&&x==ei&&y==ej) flag=1;
if(flag==1)return;
int temp=t-ut-abs(x-ei)-abs(y-ej);//x,y点到终点的最短时间是 abs(x-ei)+abs(x-ej); 剪枝!!!
if(temp<0||temp&1) return;//if((abs(ei-x)+abs(ej-y))%2!=(t-tc)%2)return;
//遇到从 0 走向 0 但是要求时间是奇数(坐标差之和为奇数)的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!
for(int i=0;i<4;i++){
if(map[x+d[i][0]][y+d[i][1]]!='X')
{//原因在于终点为D而不是'.';这也是为什么起点设成‘X’的原因
map[x+d[i][0]][y+d[i][1]]='X';
dfs(x+d[i][0],y+d[i][1],ut+1);
map[x+d[i][0]][y+d[i][1]]='.';//一定要恢复!!!
}
}
return;
}
int main(){
while(1){
wal=0;
cin>>n>>m>>t;
if(n==0&&m==0&&t==0) break;
for(int i=1;i<=n;i++)//当从0开始的时候不知道为什么硬是要超时?????
for(int j=1;j<=m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{ si=i;sj=j;}
else if(map[i][j]=='D')
{ ei=i;ej=j;}
else if(map[i][j]=='X')
{wal++;}
}
if(t>=m*n-wal)//剪枝
{ cout<<"NO"<<endl; continue;}
map[si][sj]='X';
flag=0;
dfs(si,sj,0);
if(flag==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
- hdoj1010
- hdoj1010
- HDOJ1010
- hdoj1010
- hdoj1010
- HDOJ1010(DFS)
- HDOJ1010留待学习
- HDOJ1010(搜索+剪枝)
- HDOJ1010 解题报告
- hdoj1010(dfs+剪枝技巧)
- <TLE>奇偶剪枝hdoj1010
- HDOJ1010 STILL DFS
- HDOJ1010(深搜+剪枝)
- HDOJ1010深搜+数学奇偶性剪枝
- HDOJ1010.Tempter of the Bone
- HDOJ1010 Tempter of the Bone
- hdoj1010-【Tempter of the Bone】
- HDOJ1010 Tempter of the Bone
- 空闲期
- 移植2.6.30.4到MINI2440的学习笔记
- Maven入门--概念与实例
- 画圆并保存细分点坐标
- 端口操作 + ftp +Oracle
- hdoj1010
- JVM/JDK/JRE/IDE—区别
- 什么事长连接 短连接
- 算法导论学习笔记-第二十一章-用于不相交集合的数据结构
- 疲惫!很疲惫(发发牢骚)
- 显卡性能阶梯
- Java高性能编程
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- Android Animation ------ ViewFlipper的使用