HDU1010-奇偶剪枝

题目链接:Tempter of the Bone

第一次做剪枝的题目,剪枝,说实话研究的时间不短,好像没什么实质性的进展,遇到题目,绝对有会无从下手的感觉,剪枝越来越神秘了。。。。

HDU1010一道剪枝的经典题目,自己当初想用BFS过,提交了10几遍WA,后来查了是剪枝终于死心了

PS:第一次写剪枝题目,用了一个模拟地图来做奇偶性的判定条件进行剪枝,大牛们写的那种俺实在看不懂,渣渣儿。。。。

代码有点挫。。。。562ms低空掠过

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
char ma[10][10];
bool vis[10][10];
bool mapp[10][10] = {{0,1,0,1,0,1,0,1,0,1},{1,0,1,0,1,0,1,0,1,0},{0,1,0,1,0,1,0,1,0,1},
                 {1,0,1,0,1,0,1,0,1,0},{0,1,0,1,0,1,0,1,0,1},{1,0,1,0,1,0,1,0,1,0},
                 {0,1,0,1,0,1,0,1,0,1},{1,0,1,0,1,0,1,0,1,0},{0,1,0,1,0,1,0,1,0,1},
                 {1,0,1,0,1,0,1,0,1,0}};
int n,m,T,dx,dy;
bool flag;
int mv[4][2]={{1,0},{0,-1},{0,1},{-1,0}};
void dfs(int sx,int sy,int dp)
{
   if(dp==T&&sx==dx&&sy==dy)
   {
       flag=1;   return ;
   }

   if(flag) return;

  int t = T - dp;
  if(mapp[sx][sy]==mapp[dx][dy]) //奇偶剪枝
    {
           if(t % 2) return ;
    }
  else
  {
      if(t % 2==0)
        return ;
  }
   for(int i=0;i<4;i++)
    {
        int xx = sx + mv[i][0];
        int yy = sy + mv[i][1];
      if(ma[xx][yy]!='X' && vis[xx][yy]!=1 &&0<=xx && xx<n && 0<=yy && yy<m)
      {
         vis[xx][yy] = 1;
         dfs(xx,yy,dp+1);
         vis[xx][yy] = 0;
      }
   }
   return;
}
int main()
{
    int sx,sy;
    while(~scanf("%d%d%d",&n,&m,&T))
    {
        if(n==0&&m==0&&T==0) break;
    memset(vis,0,sizeof(vis));
      for(int i=0;i<n;i++)
      {
          scanf("%s",ma[i]);
           for(int j=0;j<m;j++)
         {
            if(ma[i][j]=='S')
                { sx=i; sy=j; }
            else if(ma[i][j]=='D')
                { dx=i; dy=j; }
         }
      }
       flag=0;
       vis[sx][sy] = 1;
       dfs(sx,sy,0);
       (flag==1)? puts("YES"):puts("NO");
   }
   return 0;
}

HDU1010-奇偶剪枝,布布扣,bubuko.com

时间: 2024-08-11 05:31:49

HDU1010-奇偶剪枝的相关文章

HDU--1010 Tempter of the Bone(深搜+奇偶剪枝)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 我认为的剪枝就是在本来的代码中加入一些附加条件使之不去进行多余的计算,防止超时 奇偶剪枝的知识链接 AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int n,m,t,k,flag,starex,starey,endx,endy

hdu1010 Tempter of the Bone---DFS+奇偶剪枝

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述:根据地图,'S'为开始位置,'D'为门的位置,' . '为空地,'X'为墙,不能经过,问:在指定的时间,是否能到达'门'的位置.注意:路不可以重复经过,时间也要刚好是 t ,不能少. 思路: 此处不能用BFS,因为时间要恰好为t,还是得用DFS,不过需要剪枝才能过. 奇偶剪枝: 从一个点到达另外一个点的最短路径长度(时间)可以根据两点坐标求出,路径长度(非最短)与最短路径的长度同奇

HDU1010 DFS+剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 110290    Accepted Submission(s): 29967 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

Tempter of the Bone(dfs奇偶剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 92175    Accepted Submission(s): 25051 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

hdu1010Tempter of the Bone(dfs+奇偶剪枝)

题目链接:点击打开链接 题目描述:给定一个迷宫,给一个起点和一个终点,问能否恰好经过T步到达终点?每个格子不能重复走 解题思路:dfs+剪枝 剪枝1:奇偶剪枝,判断终点和起点的距离与T的奇偶性是否一致,如果不一致,直接剪掉 剪枝2:如果从当前到终点的至少需要的步数nt加上已经走过的步数ct大于T,即nt+ct>t剪掉 剪枝3:如果迷宫中可以走的格子小于T直接剪掉 启发:剪枝的重要性 代码: #include <cstdio> #include <cstdlib> #inclu

POJ 1322 递推+奇偶剪枝

Chocolate Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8800   Accepted: 2306   Special Judge Description In 2100, ACM chocolate will be one of the favorite foods in the world. "Green, orange, brown, red...", colorful sugar-coated

hdoj--1010&lt;dfs+奇偶剪枝&gt;

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目描述:在n*m的矩阵中,有一起点和终点,中间有墙,给出起点终点和墙,并给出步数,在该步数情况下走到终点,走过的点不能再走: 题目要点:dfs+奇偶剪枝:输入: 本题用dfs可以做出结果,但是会超时,需要用到就剪枝,来减去大部分的可能: 奇偶剪枝: 方格中起点(tx,ty)和终点(dx, dy)最小步骤是minstep=abs(tx-dx)+abs(ty-dy); 给定步数t,从起点走到终点

HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索

转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人感觉,角色扮演类的游戏,起码都可以在迷宫搜索上找到影子. 奇偶剪枝这个算法感觉十分开阔的视野~这样去描述这个具体问题实在太形象生动了~ 总而言之,十分有趣. 仔细的人会发现  每当设计到移动,我们必须想到上下左右,这也让我们看到这类算法的思路. 在学习迷宫搜索当中,我发现:这个搜索算法是先分析 找到

Tempter of the Bone(杭电1010)(DFS+奇偶剪枝)

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 74916    Accepted Submission(s): 20481 Problem Description The doggie found a bone in an ancient maze, which fascinated him a

HDU 1010 (搜索+奇偶剪枝)

题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep>t剪枝 ②搜到一个解后剪枝 ③当前走到终点最少步数>满足条件还需要走的步数剪枝(关键) ③奇偶剪枝(关键):当前走到终点步数的奇偶性应该与满足条件还需要走的步数奇偶性一致. 其中三四两步放在一步中写:remain=abs(x-ex)+abs(y-ey)-abs(dep-t) 奇偶剪枝的原理:abs(