寒假前刷题(7)搜索系列 dfs hdu 1010

本文深入探讨游戏开发领域的关键技术和实践,包括游戏引擎、动画、3D空间视频等,旨在为开发者提供全面的游戏开发知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tempter of the Bone

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 42406    Accepted Submission(s): 11468


Problem 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
 


这是我做的第一道dfs的搜索题,看了非常长的时间,最后还是的借鉴别人的想法,不过我第一次接触到了关于剪枝的相关的问题。这倒题如果什么都不做,直接就dfs的话,那么结果只有超时,这里我学到了一个方法就是奇偶剪枝,所谓奇偶剪枝可以用下面的这个矩阵来说明:

  1. 0 1 0 1 0 1
  2. 1 0 1 0 1 0
  3. 0 1 0 1 0 1
  4. 1 0 1 0 1 0
  5. 0 1 0 1 0 1 

我们可以看到如果,0想到达另一个0必须走偶数步,而要走到1需要的是奇数步。所以如果要是要走到0时间确实是奇数的可以直接忽略,反之亦然。

这就是奇偶剪枝。

关键上就是在比较abs(endx-startx)+abs(endy-starty)的奇偶性。

下面是代码:



 

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>

using namespace std;

int t,ex,ey,n,m,step;
bool flag;
char map[10][10];
int  dir[4][2]={0,1,1,0,0,-1,-1,0}; //这个是遍历数组,我是按的顺时针方向,这个题按逆时针方向会超时,所以遍历数组以后再用的时候要学会灵活的变换

void dfs(int i,int j,int step)
{
     if(i==ex&&j==ey&&step==t)
        flag=true;
     if(step>t)
       return;
     if(flag)
       return;
     if((t-step)%2!=(abs(ex-i)+abs(ey-j))%2)//判断剩余时间与步数中间的奇偶性
        return;
     for(int u=0;u<4;u++)
     {
          int x=i+dir[u][0];
          int y=j+dir[u][1];
        if(x>=0&&x<n&&y>=0&&y<m)
        {
            if(map[x][y]!='X')
            {
              map[x][y]='X';
              dfs(x,y,step+1);;
              map[x][y]='.';  //回溯法,在回去的时候要恢复,这样才能够遍历搜索下去。
            }
        }
     }
}

int main()
{
     while(cin>>n>>m>>t)
     {
          if(n==0&&m==0&&t==0)
             break;
             int i,j,k=0;
             int x,y;
          for(i=0;i<n;i++)
            for(j=0;j<m;j++)
             {
                  cin>>map[i][j];
                  if(map[i][j]=='S')
                  {
                       x=i;
                       y=j;
                       map[x][y]='X';
                  }
                  if(map[i][j]=='D')
                  {
                       ex=i;
                       ey=j;
                       k++;
                  }
                  if(map[i][j]=='.')
                       k++;
             }
          if(k<t)  //这里我第一次忘记写了,后来看了参考才想起来,这不是求最短路径,要求的是刚好那个点到哪里,所以必须刚好是t

        {
            cout<<"NO"<<endl;
            continue;
          }
            flag=false;
            dfs(x,y,0);
            if(flag)
              cout<<"YES"<<endl;
            else
              cout<<"NO"<<endl;
     }
     return 0;
}

 

内容概要:本文详细探讨了基于阻尼连续可调减振器(CDC)的半主动悬架系统的控制策略。首先建立了CDC减振器的动力学模型,验证了其阻尼特性,并通过实验确认了模型的准确性。接着,搭建了1/4车辆悬架模型,分析了不同阻尼系数对悬架性能的影响。随后,引入了PID、自适应模糊PID和模糊-PID并联三种控制策略,通过仿真比较它们的性能提升效果。研究表明,模糊-PID并联控制能最优地提升悬架综合性能,在平顺性和稳定性间取得最佳平衡。此外,还深入分析了CDC减振器的特性,优化了控制策略,并进行了系统级验证。 适用人群:从事汽车工程、机械工程及相关领域的研究人员和技术人员,尤其是对车辆悬架系统和控制策略感兴趣的读者。 使用场景及目标:①适用于研究和开发基于CDC减振器的半主动悬架系统的工程师;②帮助理解不同控制策略(如PID、模糊PID、模糊-PID并联)在悬架系统中的应用及其性能差异;③为优化车辆行驶舒适性和稳定性提供理论依据和技术支持。 其他说明:本文不仅提供了详细的数学模型和仿真代码,还通过实验数据验证了模型的准确性。对于希望深入了解CDC减振器工作原理及其控制策略的读者来说,本文是一份极具价值的参考资料。同时,文中还介绍了多种控制策略的具体实现方法及其优缺点,为后续的研究和实际应用提供了有益的借鉴。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值