ZOJ2110 HDU1010 搜索 Tempter of the Bone

                                                                   传送门:Tempter of the Bone

             大意是给一个矩阵,叫你是否可以在给定的可走路径上不重复地走,在最后一秒走到终点。

我用了两个剪枝,且称其为简直001和剪枝002,事实证明001不要都可以,002不要也能过--||。就当练习一下剪枝。

特别是002很有用:

                                      if( d % 2 != (Time-t) % 2 )

                                         return false ; (d=~x+~y)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring> 
#include<string.h>
#include<cmath>
using namespace std;
const int INF=10000000;
int dis[8][8];
char c[8][8];
int x[]={0,-1,0,1};
int y[]={1,0,-1,0};
int sx,sy;	
int n,m,t;
int fx,fy;
void _Searchdis(int xx,int yy)
{
     for(int i=0;i<4;i++)
      if(xx+x[i]>=1&&xx+x[i]<=n&&yy+y[i]>=1&&yy+y[i]<=m)
       if(c[xx+x[i]][yy+y[i]]!='X')
        if(dis[xx][yy]+1<dis[xx+x[i]][yy+y[i]]){
			dis[xx+x[i]][yy+y[i]]=dis[xx][yy]+1;
			_Searchdis(xx+x[i],yy+y[i]);
       }
       return ;
}
bool _BFS(int xx,int yy,int steps)
{
	if(xx==sx&&yy==sy&&steps==t) return true;
	if(steps+dis[xx][yy]>t) return false;//剪枝1
	if((abs(xx-sx)+abs(yy-sy))%2!=abs(t-steps)%2) return false;//剪枝2 
	for(int i=0;i<4;i++)
	 if(xx+x[i]>=1&&xx+x[i]<=n&&yy+y[i]>=1&&yy+y[i]<=m)
	  if(c[xx+x[i]][yy+y[i]]!='X')
	   {
		    c[xx+x[i]][yy+y[i]]='X';
		    if(_BFS(xx+x[i],yy+y[i],steps+1)) return true; 
		    c[xx+x[i]][yy+y[i]]='.';
	   }
	   return false;
}
int main()
{
    int i,j;
	while(scanf("%d%d%d",&n,&m,&t)&&(n||m||t))
	{
		for(int i=1;i<=n;i++){
		 for(int j=1;j<=m;j++)
		  {	 
			 cin>>c[i][j];
			 if(c[i][j]=='D'){ sx=i;sy=j;}
			 if(c[i][j]=='S'){ fx=i;fy=j;}
		     dis[i][j]=INF;
		  }
		}
		 dis[sx][sy]=0;
		_Searchdis(sx,sy);
		c[fx][fy]='X';//不要搞忘 
		if(_BFS(fx,fy,0)) printf("YES
");
		else printf("NO
");
	}
	return 0;
}

原文地址:https://www.cnblogs.com/hua-dong/p/7603959.html