Tempter of the Bone(DFS+剪枝)

来源:互联网 发布:淘宝显示被挤爆了 编辑:程序博客网 时间:2024/05/10 15:24

Description
The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.

Input
The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

‘X’: a block of wall, which the doggie cannot enter;
‘S’: the start point of the doggie;
‘D’: the Door; or
‘.’: an empty block.

The input is terminated with three 0’s. This test case is not to be processed.

Output
For each test case, print in one line “YES” if the doggie can survive, or “NO” otherwise.

Sample Input
4 4 5
S.X.
..X.
..XD
….
3 4 5
S.X.
..X.
…D
0 0 0

Sample Output
NO
YES

题意:输入N*M大小的迷宫矩阵,K为门开的时间,S为起点,D为终点,每走一格需要消耗一个单位的时间,因为每走到一格,一个单位时间内这个格子就会消失,所以也不能在D等到门开,必须在K时刻准确地走到D
题解:必须对已知条件进行剪枝,否则会超时
1、如果所有的’.’数量加起来都没有k大,那么直接输出NO
2、根据题目,doggie必须在第t秒到达门口。也就是需要走t-1步。设doggie开始的位置为(sx,sy),目标位置为(ex,ey).如果abs(ex-x)+abs(ey-y)为偶数,则abs(ex-x)和abs(ey-y)奇偶性相同,所以需要走偶数步

代码(C)

#include<cstdio>#include<iostream>using namespace std;char a[9][9];  int starti,startj,endi,endj,t,n,m;  int flag;  int b[4][2]={{0,1},{0,-1},{1,0},{-1,0}};  void DFS(int px,int py,int time)  {      int i;      if(flag==1)return;      if(a[px][py]=='X')return;      if(px==endi&&py==endj&&time==t){flag=1;return;}      if(px<1||px>n||py<1||py>m)return;     if(time>t)return;      for(i=0;i<4;i++)      {          a[px][py]='X';          DFS(px+b[i][0],py+b[i][1],time+1);          a[px][py]='.';          if(flag==1)return;      }  }  int main()  {      int i,j,block;      char temp;      while(scanf("%d%d%d",&n,&m,&t)!=EOF)      {          block=0;          flag=0;          if(n==0&&m==0&&t==0)break;          for(i=1;i<=n;i++)          {              scanf("%s",a[i]);            for(j=1;j<=m;j++)            {                if(a[i][j]=='S'){starti=i;startj=j;continue;}                  if(a[i][j]=='X'){block++;continue;}                  if(a[i][j]=='D'){endi=i;endj=j;}              }          }          if(t>(n*m-block))//条件1剪枝        {              printf("NO\n");               continue;          }          if((endi+starti+startj+endj+t)%2==1)//条件2剪枝        {              printf("NO\n");            continue;          }          DFS(starti,startj,0);          if(flag==1)  printf("YES\n");        else  printf("NO\n");       }      return 0;  }  
0 0
原创粉丝点击