两个剪枝问题

1. 当两点的距离(需要走的步数)大于剩下的时间时 剪去

2.奇偶剪枝问题

如果起点到终点所需走的步数的奇偶性与时间奇偶性不同的时候 剪去

起点到终点步数的奇偶性的判断

首先 明确点的奇偶性判断 看起横纵坐标和为奇数还是偶数

如果起点和终点的奇偶性相同 则步数为偶数 否则为奇数

具体的代码实现    (start1+start2+end1+end2+time)%2==1  (如果两个数的奇偶性相同的话 两者和对2取余为0)

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
int n,m,time;
int flag;//判断是否有符合条件的搜索
int visit[20][20];
char mapp[20][20];
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};//用于四个方向的遍历
void dfs(int x,int y,int t)
{
 int i;
 if(flag==1) return;//找到一个就退回。。 减少时间的消耗
 if(mapp[x][y]=='D')
 {
    if(t==time)
    flag=1;
    return;  //递归的终止条件 得多注意
    }
 if(t>=time) return;
 for(i=0;i<4;i++)
 {
  int xx,yy;
  xx=x+dir[i][0];
  yy=y+dir[i][1];
  if(xx<0||xx>=n||yy<0||yy>=m||mapp[xx][yy]=='X'||visit[xx][yy]==1) continue;
  visit[xx][yy]=1;
  dfs(xx,yy,t+1);//此时的i如果为全局变量的话 这里就对i的值做了改变
  visit[xx][yy]=0;
 }
}

int main()
{
   int start1,start2,i,j,end1,end2;
   while(scanf("%d %d %d",&n,&m,&time)!=EOF)
  {
    if(n==0&&m==0&&time==0) break;
   memset(visit,0,sizeof(visit));
   flag=0;
   for(i=0;i<n;i++)
   {
    for(j=0;j<m;j++)
    {
       cin>>mapp[i][j];
    }
   }
   for(i=0;i<n;i++)//找到初始位置 终止位置 便于剪枝的进行
   {
    for(j=0;j<m;j++)
    {
     if(mapp[i][j]=='S')
     {
      start1=i;
      start2=j;
     } 
     if(mapp[i][j]=='D')
  {
    end1=i;
   end2=j;
  }
    }
   }
   if((abs(start1-end1)+abs(start2-end2))>time||(start1+start2+end1+end2+time)%2==1)//剪枝咯 第一个剪枝为如果剩下的距离大于时间 剪去 第二个剪枝是奇偶减枝
   {
   printf("NO\n");
   continue;
   }
   visit[start1][start2]=1;
   dfs(start1,start2,0);
   if(flag==1) printf("YES\n");
   else printf("NO\n");
 }
 return 0;
}

这次优化主要就是应用了剪枝  加油

最新文章

  1. ftplib模块
  2. playframework中多附件上传注意事项
  3. Spring MVC 流程图
  4. HOCON 了解
  5. 当类库项目中无法使用Application.StartupPath
  6. SQL server数据类型int、bigint、smallint、tinyint
  7. [转载]使用uiautomator做UI测试
  8. 本地plsqldev.exe连接远端oracle数据库
  9. alimama open source mdrill启动后访问蓝鲸任务时出错:Caused by:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss
  10. Fedora最小化安装后没有ifconfig命令
  11. html逻辑运算符
  12. Python学习笔记006_异常_else_with
  13. 用Dedecms5.7的arclist标签调用文章内容
  14. [poj3280]Cheapest Palindrome_区间dp
  15. sql语句修改字段约束为不为空 并为其设置主键
  16. IDEA jrebet插件安装
  17. 在ubuntu系统中,python依赖存放的路径
  18. Linux vm运行参数 - OOM相关的参数
  19. 标准Drupal7安装中文翻译出错解决办法
  20. Qt信号槽的一些事

热门文章

  1. PEP 476 -- Enabling certificate verification by default for stdlib http clients
  2. colock
  3. 国人开发的api测试工具 ApiPost
  4. Spring的Bean的生命周期方法执行顺序测试
  5. ES6深入浅出-5 新版对象-2.属性修饰符
  6. Django 引用{% url &quot;name&quot;%} 避免链接硬编码
  7. div定位relative和absolute测试1
  8. 在网页中嵌入Base64编码文件
  9. node不要使用最新版本,使用LTS版本
  10. php+memcache高速缓存