程序采用递归方式:
源码:
#include<iostream>
#include<cmath>
using namespace std;
#define MAX 7
char a[MAX][MAX];
int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void f(int x_b,int y_b,int x_e,int y_e,int t);
bool flag=false;
int N,M,T;
int main()
{
int i,j;
int x_b,y_b,x_e,y_e,sum=0;
while(cin>>N>>M>>T && (N!=0 ||M!=0)||(T!=0))
{
flag=false;
sum=0;
for(i=0;i<N;i++)
cin>>a[i];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
if(a[i][j]=='S')
{
x_b=i;
y_b=j;
}
else if(a[i][j]=='D')
{
x_e=i;
y_e=j;
}
else if(a[i][j]=='X')
sum++;
}
if((N*M-sum)<=T) //剪枝,当可走的路小于时间限制是为NO
{
cout<<"NO"<<endl;
continue;
}
else
{
a[x_b][y_b]='X';
f(x_b,y_b,x_e,y_e,0);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
void f(int x_b,int y_b,int x_e,int y_e,int t)
{
int i,x,y;
if((x_b==x_e) && (y_b==y_e) &&(t==T))
flag=true;
if(flag) //剪枝,否则超时,不加的时候会循环所有可以走的路,直到遍历完全,加上之后在找到一条路后直接返回。
return;
int temp=(T-t)-abs(x_b-x_e)-abs(y_b-y_e); //剪枝
if(temp<0||temp&1)
return;
for(i=0;i<4;i++)
{
x=x_b+d[i][0];
y=y_b+d[i][1];
if(t<T)
{
if(x<N && x>=0 && y>=0 && y<M)
{
if(a[x][y]!='X')
{
a[x][y]='X';
f(x,y,x_e,y_e,t+1);
a[x][y]='.';
}
}
}
}
}
需要注意地方:函数 abs和fabs都是求数的绝对值,原型:int abs(int x)求整型x的绝对值;double fabs(double x)求x的绝对值;在vc环境下,如果是对整型数求绝对值,虽然都可以通过,建议只用前者,后者在别的编译器上可能出现函数重载错误。