标签:des style blog class code java
题目:
4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0
NO YES
(t-abs(enx-x)-abs(eny-y))%2因为如果从一个点到重点的横纵坐标之和和奇数,若剩余时间为偶数,那么肯定就是不可能到达的。。反之剩余时间为奇数。。。一个点到重点的横纵坐标之和和偶数,那么同样是不可能到达的。。。就算转弯也不可能,因为转弯必定是偶数的增加,一来一回。。。。然后就是搜索了,从上,下,左,右四个方向搜索。。。。生成一颗解答树。。#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int n,m;
const int maxn=7;
int map[maxn][maxn],pos;
int stx,sty,enx,eny;
/*
奇偶性剪枝就是说如果给的一个点到另外一个点如果只有奇数步可以到,那么如果两点的横纵左边之和为偶数,那么肯定不会到达。
不管如何走,因为转弯的话,肯定也是偶数步。。所以奇偶性剪枝的原理就是这样
具体链接:
*/
int abs(int a)
{
if(a>=0)
return a;
else
return -a;
}
int d[4][2]={0,1,1,0,0,-1,-1,0};//二维数组表示向上,向下,向左,向右的情况。。
void dfs(int x,int y,int t)
{
if(pos==1) return;
else if(t==0)
{
if(x==enx&&y==eny)
{
pos=1;
return;
}
else
return;
}
else if(t<abs(enx-x)+abs(eny-y)||(t-abs(enx-x)-abs(eny-y))%2)/*奇偶性剪枝*/ return ;
else
{
for(int i=0;i<4;i++)
{
int midx=x+d[i][0];
int midy=y+d[i][1];
if(midx>0&&midx<=n&&midy>0&&midy<=m&&(map[midx][midy]==‘.‘||map[midx][midy]==‘D‘))
{
map[midx][midy]=‘X‘;
dfs(midx,midy,t-1);
map[midx][midy]=‘.‘;
}
}
}
return;
}
int main()
{
char str[10];
int i,j,t;
while(scanf("%d%d%d",&n,&m,&t)!=EOF)
{
if(n==0&&m==0&&t==0)
return 0;
else
{
for(i=1;i<=n;i++)
{
scanf("%s",str);
for(j=1;j<=m;j++)
{
map[i][j]=str[j-1];
if(map[i][j]==‘S‘) stx=i,sty=j;
if(map[i][j]==‘D‘) enx=i,eny=j;
}
}
pos=0;
dfs(stx,sty,t);
if(pos)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
标签:des style blog class code java
原文地址:http://blog.csdn.net/u014303647/article/details/25547427