算法训练 Lift and Throw  
时间限制:3.0s   内存限制:256.0MB
    
问题描述
  给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之差的绝对值.
  Laharl, Etna, Flonne一开始在这条射线上不同的三个点, 他们希望其中某个人能够到达下标最大的点.
  每个角色只能进行下面的3种操作, 且每种操作不能每人不能进行超过一次.
  1.移动一定的距离
  2.把另一个角色高举过头
  3.将举在头上的角色扔出一段距离
  每个角色有一个movement range参数, 他们只能移动到没有人的位置, 并且起点和终点的距离不超过movement range.
  如果角色A和另一个角色B距离为1, 并且角色B没有被别的角色举起, 那么A就能举起B. 同时, B会移动到A的位置,B原来所占的位置变为没有人的位置. 被举起的角色不能进行任何操作, 举起别人的角色不能移动.同时, 每个角色还有一个throwing range参数, 即他能把举起的角色扔出的最远的距离. 注意, 一个角色只能被扔到没有别的角色占据的位置. 我们认为一个角色举起另一个同样举起一个角色的角色是允许的. 这种情况下会出现3个人在同一个位置的情况. 根据前面的描述, 这种情况下上面的两个角色不能进行任何操作, 而最下面的角色可以同时扔出上面的两个角色. 你的任务是计算这些角色能够到达的位置的最大下标, 即最大的数字x, 使得存在一个角色能够到达x.
输入格式
  输入共三行, 分别为Laharl, Etna, Floone的信息.
  每一行有且仅有3个整数, 描述对应角色的初始位置, movement range, throwing range.
  数据保证3个角色的初始位置两两不相同且所有的数字都在1到10之间.</div>
输出格式
  仅有1个整数, 即Laharl, Etna, Flonne之一能到达的最大距离.
样例输入
9 3 3
4 3 1
2 3 3
样例输出
15
样例说明
  一开始Laharl在位置9, Etna在位置4, Flonne在位置2.
  首先, Laharl移动到6.
  然后Flonne移动到位置5并且举起Etna.
  Laharl举起Flonne将其扔到位置9.
  Flonne把Etna扔到位置12.
  Etna移动到位置15.
 
我想的思路是一人有三种操作,分别是移动,举起旁边的,扔自己上面的。三个人就是九种。
然后九种操作进行深度搜索。
样例给过了,但提交只有两组数据对了。
做了两晚上都没调好,我感觉我的思路应该没有错误。
 如果你有思路,希望告知我。
递归的程序虽然比较好想,但是稍微一复杂根本就没法调bug啊,很容易迷失在不知第几层。。。
 #include <iostream>
#include <cstdio> using namespace std; typedef struct node{
int loca;
int moverange;
int throwrange;
};
struct node a[];
int w[]={};
int is_move[]={};
int is_lift[]={};
int is_throw[]={};
int is_belifted[]={};
int ans=;
int step[]={}; int dfs();
//第一个人的第一种操作,移动
void fun11(){
if(!is_move[]){
int t=a[].loca+a[].moverange;
for(int i=a[].loca-a[].moverange; i<=t; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=a[].loca;
int t3=is_move[];
w[a[].loca]=;
w[i]=;
a[].loca=i;
is_move[]=;
dfs();
w[a[].loca]=t1;
w[i]=;
a[].loca=t2;
is_move[]=t3;
} }
}
}
//第一个人的第二种操作,举起两边的
void fun12(){
for(int i=;i<=;i++){
if(w[a[].loca-]==i){
int t1=w[a[].loca-];
int t2=is_belifted[i];
int t3=is_lift[]; w[a[].loca-]=;
is_belifted[i]=;
is_lift[]=i;
dfs(); w[a[].loca-]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
if(w[a[].loca+]==i){
int t1=w[a[].loca+];
int t2=is_belifted[i];
int t3=is_lift[];
w[a[].loca+]=;
is_belifted[i]=;
is_lift[]=i;
dfs();
w[a[].loca+]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
}
}
//第一个人的第三种操作,扔自己上面的
void fun13(){
if(!is_throw[] && is_lift[]!=){
for(int i=a[].loca-a[].throwrange; i<=a[].loca+a[].throwrange; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=w[i];
int t3=a[].loca;
int t4=is_throw[];
w[a[].loca]=;
w[i]=is_lift[];
a[].loca=i;
is_throw[]=;
dfs();
w[a[].loca]=t1;
w[i]=t2;
a[].loca=t3;
is_throw[]=t4;
} }
}
} //第二个人的第一种操作,移动
void fun21(){
if(!is_move[]){
int t=a[].loca+a[].moverange;
for(int i=a[].loca-a[].moverange; i<=t; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=a[].loca;
int t3=is_move[];
w[a[].loca]=;
w[i]=;
a[].loca=i;
is_move[]=;
dfs();
w[a[].loca]=t1;
w[i]=;
a[].loca=t2;
is_move[]=t3;
} }
}
}
//第二个人的第二种操作,举起两边的
void fun22(){
for(int i=;i<=;i++){
if(w[a[].loca-]==i){
int t1=w[a[].loca-];
int t2=is_belifted[i];
int t3=is_lift[];
w[a[].loca-]=;
is_belifted[i]=;
is_lift[]=i;
dfs();
w[a[].loca-]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
if(w[a[].loca+]==i){
int t1=w[a[].loca+];
int t2=is_belifted[i];
int t3=is_lift[];
w[a[].loca+]=;
is_belifted[i]=;
is_lift[]=i;
dfs();
w[a[].loca+]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
}
}
//第二个人的第三种操作,扔自己上面的
void fun23(){
if(!is_throw[] && is_lift[]!=){
for(int i=a[].loca-a[].throwrange; i<=a[].loca+a[].throwrange; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=w[i];
int t3=a[].loca;
int t4=is_throw[];
w[a[].loca]=;
w[i]=is_lift[];
a[].loca=i;
is_throw[]=;
dfs();
w[a[].loca]=t1;
w[i]=t2;
a[].loca=t3;
is_throw[]=t4;
} }
}
}
//第三个人的第一种操作,移动
void fun31(){
if(!is_move[]){
int t=a[].loca+a[].moverange;
for(int i=a[].loca-a[].moverange; i<=t; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=a[].loca;
int t3=is_move[];
w[a[].loca]=;
w[i]=;
a[].loca=i;
is_move[]=;
dfs();
w[a[].loca]=t1;
w[i]=;
a[].loca=t2;
is_move[]=t3;
} }
}
}
//第三个人的第二种操作,举起两边的
void fun32(){
for(int i=;i<=;i++){
if(w[a[].loca-]==i){
int t1=w[a[].loca-];
int t2=is_belifted[i];
int t3=is_lift[];
w[a[].loca-]=;
is_belifted[i]=;
is_lift[]=i;
dfs();
w[a[].loca-]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
if(w[a[].loca+]==i){
int t1=w[a[].loca-];
int t2=is_belifted[i];
int t3=is_lift[];
w[a[].loca+]=;
is_belifted[i]=;
is_lift[]=i;
dfs();
w[a[].loca+]=t1;
is_belifted[i]=t2;
is_lift[]=t3;
}
}
}
//第三个人的第三种操作,扔自己上面的
void fun33(){
if(!is_throw[] && is_lift[]!=){
for(int i=a[].loca-a[].throwrange; i<=a[].loca+a[].throwrange; i++){
if(!w[i] && i>=){
int t1=w[a[].loca];
int t2=w[i];
int t3=a[].loca;
int t4=is_throw[];
w[a[].loca]=;
w[i]=is_lift[];
a[].loca=i;
is_throw[]=;
dfs();
w[a[].loca]=t1;
w[i]=t2;
a[].loca=t3;
is_throw[]=t4;
} }
}
} int dfs(){
ans=max(ans,a[].loca);
ans=max(ans,a[].loca);
ans=max(ans,a[].loca);
//if(is_move[1]==1&&is_move[2]==1&&is_move[3]==1&&is_throw[1]==1&&is_throw[2]==1&&is_throw[3]==0||is_throw[1]==1&&is_throw[2]==0&&is_throw[3]==1||is_throw[1]==0&&is_throw[2]==1&&is_throw[3]==1){
// return 0;
//}else{
for(int i=;i<=;i++){
if(!step[i]){
switch(i){
case :step[]=;fun11();step[]=;break;
case :step[]=;fun12();step[]=;break;
case :step[]=;fun13();step[]=;break;
case :step[]=;fun21();step[]=;break;
case :step[]=;fun22();step[]=;break;
case :step[]=;fun23();step[]=;break;
case :step[]=;fun31();step[]=;break;
case :step[]=;fun32();step[]=;break;
case :step[]=;fun33();step[]=;break;
}
} }
return ;
//} } int main()
{
for(int i=;i<=;i++){
scanf("%d %d %d",&a[i].loca,&a[i].moverange,&a[i].throwrange);
}
dfs();
printf("%d\n",ans);
return ;
}

总是有一个程序的bug没找到的更多相关文章

  1. 我怀疑这是IDEA的BUG,但是我翻遍全网没找到证据!

    你好呀,我是歪歪. 前几天有朋友给我发来这样的一个截图: 他说他不理解,为什么这样不报错. 我说我也不理解,把一个 boolean 类型赋值给 int 类型,怎么会不报错呢,并接着追问他:这个代码截图 ...

  2. 创建 userSettings/Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings 的配置节处理程序时出错: 未能加载文件或程序集“System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。系统没找到指定的文件

    创建 userSettings/Microsoft.SqlServer.Configuration.LandingPage.Properties.Settings 的配置节处理程序时出错: 未能加载文 ...

  3. 微信小程序没找到构建npm或者没找到node_modules目录以及如何在小程序中引入vant weapp组件

    微信小程序没找到构建npm或者没找到node_modules目录解决方法如下: 按照微信小程序提供的文档npm install是不行的,直接提示没找到可构建的npm包. 1.直接安装:npm init ...

  4. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  5. --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--

    导语:今年三月份,在CSDN博客和新浪微博上有一篇<从1.5K到18K,一个程序员的5年成长之路>被众人分享和传阅,这篇博文首先介绍了作者自学之初薄弱的基础,然后通过流水账形式分享了那个从 ...

  6. 专访雷水果国:离1.5K至18K 一个程序猿5每年的成长之路

    我只是一个小菜鸟,对于自主学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群.希望光临本博客的人能够进来交流. 寻 ...

  7. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

  8. 说实话当一个程序猿不easy

    我以前说过,程序猿不是一般的人,是具有某种超能里的人.但问题是.程序猿往往意识不到自己的这样的特异功能.在他们的眼里.会觉得自己非常普通.跟常人一样,所以,程序猿能做到的事情,其它人--比方他们的客户 ...

  9. OD 实验(十七) - 对一个程序的逆向分析

    程序: 运行程序 弹出一个对话框,点击 OK 来到主界面,点击 Help -> Register Now 这是输入注册码的地方 按关闭程序的按钮 会提示剩下 30 天的使用时间 用 Ressco ...

随机推荐

  1. .NET 常用框架

    1.Hangfire 2.Lucene.Net 3.Log4Net 4.Quartz.Net 5.Autofac 6.SqlSugar 7.NPOI 8.Senparc.Weixin.MP 9.Aut ...

  2. 使用 antd Table组件, 异步获取数据

    使用React.js + Redux + antd 制作CMS 后台内容管理系统,分享一点点积累,欢迎讨论. 在this.state中初始化数据: this.state = { pageNum:1, ...

  3. inference和learning

    一开始对于机器学习,主要是有监督学习,我的看法是: 假定一个算法模型,然后它有一些超参数,通过喂多组数据,每次喂数据后计算一下这些超参数.最后,数据喂完了,参数取值也就得到了.这组参数取值+这个算法, ...

  4. HTML5利用link标签的rel=import引入html页面

    如果是以前,我们可以使用iframe去引入,现在可以是这样的形式:<link rel="import" href="a.html" id="tm ...

  5. 做一个阅读管理APP

    背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...

  6. 放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权

    如果说最近国内科技公司最牛逼最令人振奋的新闻是啥,显然,就是两天前在3GPP RAN1 87次会议的5G短码方案讨论中,华为顺利碾压高通,战胜列强,拿下了5G的控制编码方案的标准. 虽然说,目前,华为 ...

  7. Protobuf for Python测试保存和读取文件

    安装pip, setuptools, and wheel 如果已经从python.org,安装啦Python 2 >=2.7.9 or Python 3 >=3.4 ,那么就已经有啦pip ...

  8. ubuntu14.04 安装pip

    参考链接: 1.http://www.liquidweb.com/kb/how-to-install-pip-on-ubuntu-14-04-lts/ 2.http://idroot.net/tuto ...

  9. Emgu.CV/opencv 绘图 线面文字包括中文

    绘图很简单 Emgu.CV.Image<Bgr, Byte> image;   使用image.Draw可以画各种图形和文字包括英文及数字,不支持中文   CircleF circle = ...

  10. 解决ArcGIS安装之后出现的Windows installer configures问题

    ----Please wait while Windows installer configures ArcGIS Desktop Error Message错误信息 When launching A ...