迷宫问题,注意剪枝!!!
AC代码:
#include<stdio.h>
#include<math.h>
int n,m,t,flag;
int startx,starty,endx,endy,starttime,wallnum;
int movex[]={0,-1,0,1},movey[]={-1,0,1,0};//
char maze[10][10];
int abs(int a,int b)
{
int c;
c=a-b;
if(c>0)
return c;
else
return b-a;
}
int dfs(int sx,int sy,int st)
{
int i,time;
if(sx==endx&&sy==endy&&st==t)
{//到达终点
flag=1;
return 1;
}
time=t-st-abs(sx,endx)-abs(sy,endy);
if(time<0||time%2!=0)//剪枝
return 0;
for(i=0;i<4;i++)
{
if(sx+movex[i]<0||sx+movex[i]>m-1||sy+movey[i]<0||sy+movey[i]>n-1)
continue;
if(maze[sx+movex[i]][sy+movey[i]]!='X')
{
maze[sx+movex[i]][sy+movey[i]]='X';
dfs(sx+movex[i],sy+movey[i],st+1);
maze[sx+movex[i]][sy+movey[i]]='.';
}
if(flag) break;
}
}
int main()
{
while(scanf("%d%d%d",&m,&n,&t)!=EOF&&!(m==0&&n==0&&t==0))
{
int i,j;
getchar();//
flag=0;//标志量 ,为1时说明找到出口
wallnum=0;//墙的数量起始为0
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
scanf("%c",&maze[i][j]);
if(maze[i][j]=='S')
{
startx=i;
starty=j;
maze[startx][starty]='X';//标记起始位置,走过的不能再走了
}
else if(maze[i][j]=='D')
{
endx=i;
endy=j;
}
else if(maze[i][j]=='X')
wallnum++;
}
getchar();//接受换行符
}
if(n*m-wallnum>=t)
{
dfs(startx,starty,0);
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}