埃及分数The Rotation Game骑士精神——IDA*

IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题。

估价函数设计思路:观察一步最多能向答案靠近多少。

埃及分数

题目大意:

  给出一个分数,由分子a 和分母b 构成,现在要你分解成一系列互不相同的单位分数(形如:1/a,即分子为1),要求:分解成的单位分数数量越少越好,如果数量一样,最小的那个单位分数越大越好。

如:

  19/45 = 1/3 + 1/12 + 1/180;

  19/45 = 1/5 + 1/6 + 1/18;

  以上两种分解方法都要3个单位分数,但下面一个的最小单位分数1/18比上一个1/180大,所以第二个更优。

题解:
dfs直接搜爆炸,因为深度无限。

bfs爆炸,空间不行。

所以,采用有深度限制的,并且不耗费空间的迭代加深搜索。

深度即分数的个数。

配合一下A*思想。

剪枝:

1.每次一步到达小于剩余分数的最小分母。

return b/a+1

2.如果当前可以选择的分数(已经是最大的)*剩下的步数<剩下的分数,return (A*思想)

3.如果只剩最后一步,直接判断能否取到。

对于不能取的处理,开一个数组记录。>1000都可以取的。

分数运算,手推式子。注意约分

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000+5;
ll a,b;
int k,T;
bool fl;
ll ans[N];
ll mem[N];
bool no[N];
int dp;
ll getfirst(ll a,ll b){return b/a+1;
}
bool cmp1(ll s1,ll m1,ll s2,ll m2){//s1/m1 > s2/m2 ?return (ll)s1*m2>(ll)m1*s2;
}
bool cmp2(ll s1,ll m1,ll s2,ll m2){//s1/m1 >= s2/m2 ?return (ll)s1*m2>=(ll)m1*s2;
}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;
}
void sub(ll &s1,ll &m1,ll s2,ll m2){s1=s1*m2-s2*m1;m1=m1*m2;ll g=gcd(s1,m1);s1/=g;m1/=g;
}
bool better(){for(int i=dp;i>=dp;i--){if(mem[i]!=ans[i]){//cout<<mem[i]<<" "<<ans[i]<<endl; return (ans[i]==0)||(mem[i]<ans[i]);} } return false;
}
void dfs(int now,ll lim,ll rs,ll rm){//if(dp<4) cout<<now<<" "<<lim<<" "<<rs<<" "<<rm<<endl;if(now==dp){if(rs==1){if(rm<lim) return;//if(rm<=1000&&no[rm]) return;fl=true;//cout<<" ok "<<endl;mem[dp]=rm;if(better()){///cout<<"better "<<endl;
                for(int i=1;i<=dp;i++){
                    //cout<<mem[i]<<" ";
                    ans[i]=mem[i];}//cout<<endl;
            }mem[dp]=0;}return;}lim=max(lim,getfirst(rs,rm));for(int i=lim;;i++){if(cmp1(rs,rm,(dp-now+1),i)) return;if(cmp2(rs,rm,1,i)){ll hs=rs,hm=rm;sub(hs,hm,1,i);mem[now]=i;dfs(now+1,i+1,hs,hm);mem[now]=0;}}
}
int main(){scanf("%lld%lld",&a,&b);int t;for(int i=1;i<=k;i++){scanf("%d",&t);no[t]=1;}fl=false;while(!fl){dp++;//if(dp<4) cout<<dp<<endl;dfs(1,2,(ll)a,(ll)b);}for(int i=1;i<=dp;i++){printf("%lld ",ans[i]);}return 0;
}
View Code

 

The Rotation Game

每次8种选择吃不消。

迭代加深直接做。

A*估价:中间8个数,最多的那一个一次转动最多多一个。如果中间的8个最多的那一个和8的差距比剩余步数多,return

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=9;
int mp[N][N];
int st[N][N];
char sta[10005],top;
char ans[10005],sum;
int dp,num;
bool fl;
int cnt[4];
int fan[9]={0,6,5,8,7,2,1,4,3};
int fin(){cnt[1]=cnt[2]=cnt[3]=0;for(int i=3;i<=5;i++)for(int j=3;j<=5;j++)cnt[mp[i][j]]++;if(cnt[1]==8) return 1;if(cnt[2]==8) return 2;if(cnt[3]==8) return 3;
}
int che(){cnt[1]=cnt[2]=cnt[3]=0;for(int i=3;i<=5;i++){for(int j=3;j<=5;j++){cnt[mp[i][j]]++;}}int big=max(cnt[1],max(cnt[2],cnt[3]));return 8-big;
}
void mvh(int d){if(d==3){int tmp=mp[3][7];for(int i=7;i>=2;i--) mp[3][i]=mp[3][i-1];mp[3][1]=tmp;}else if(d==4){int tmp=mp[5][7];for(int i=7;i>=2;i--) mp[5][i]=mp[5][i-1];mp[5][1]=tmp;    }else if(d==7){int tmp=mp[5][1];for(int i=1;i<=6;i++) mp[5][i]=mp[5][i+1];mp[5][7]=tmp;}else{int tmp=mp[3][1];for(int i=1;i<=6;i++) mp[3][i]=mp[3][i+1];mp[3][7]=tmp;}
}
void mvz(int d){if(d==1){int tmp=mp[1][3];for(int i=1;i<=6;i++) mp[i][3]=mp[i+1][3];mp[7][3]=tmp;}else if(d==2){int tmp=mp[1][5];for(int i=1;i<=6;i++) mp[i][5]=mp[i+1][5];mp[7][5]=tmp;}else if(d==5){int tmp=mp[7][5];for(int i=7;i>=2;i--) mp[i][5]=mp[i-1][5];mp[1][5]=tmp;}else{int tmp=mp[7][3];for(int i=7;i>=2;i--) mp[i][3]=mp[i-1][3];mp[1][3]=tmp;}
}
bool cmp(){for(int i=1;i<=dp;i++){if(sta[i]<ans[i]) return true;if(sta[i]>ans[i]) return false;}return false;
}
void dfs(int now,int las){if(che()>dp-now+1) return;if(now==dp+1){if(che()==0){if(!fl){memcpy(ans,sta,sizeof sta);num=fin();}else if(cmp()){memcpy(ans,sta,sizeof sta);num=fin();}fl=true;}return;}for(int i=1;i<=8;i++){if(i==fan[las]) continue;if((i-1)%4>1) mvh(i);else mvz(i);sta[++top]=i-1+'A';dfs(now+1,i);sta[top--]=' ';if((fan[i]-1)%4>1) mvh(fan[i]);else mvz(fan[i]);}
}
void clear(){dp=0;fl=false;
}
int main(){while(1){clear();scanf("%d",&st[1][3]);//cout<<"aa "<<endl;if(st[1][3]==0) break;scanf("%d",&st[1][5]);scanf("%d%d",&st[2][3],&st[2][5]);for(int i=1;i<=7;i++) scanf("%d",&st[3][i]);scanf("%d%d",&st[4][3],&st[4][5]);for(int i=1;i<=7;i++) scanf("%d",&st[5][i]);scanf("%d%d",&st[6][3],&st[6][5]);scanf("%d%d",&st[7][3],&st[7][5]);memcpy(mp,st,sizeof st);if(che()==0){printf("No moves needed\n");printf("%d\n",fin());continue;}fl=false;while(!fl){dp++;memcpy(mp,st,sizeof st);dfs(1,0);}printf("%s\n",ans+1);printf("%d\n",num);}return 0;
}
View Code

 

骑士精神

也许可以折半爆搜。

但是显然不够漂亮。

明显“超15步-1”,就迭代加深了。

估价函数:每次,骑士最多归位一个。如果算上最后一步的空格,可能归位2个。

所以,当前和终止的差距-1大于剩余步数的话,一定不行。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=6;
int T;
char st[6][6];
int dp;
bool fl;
int nd[6][6]={{0,0,0,0,0,0},{0,1,1,1,1,1},{0,0,1,1,1,1},{0,0,0,2,1,1},{0,0,0,0,0,1},    {0,0,0,0,0,0}
};
int mp[6][6];
int mv[8][2]={{-1,+2},{-1,-2},{-2,+1},{-2,-1},{+1,+2},{+1,-2},{+2,-1},{+2,+1}};
int che(int re){int dif=0;for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){dif+=(mp[i][j]!=nd[i][j]);}}if(dif==0) return 2;return dp-re+1>=dif-1;    
}
void dfs(int now,int x,int y){if(!che(now)) return;if(fl) return;if(now==dp+1){if(che(now)==2) {fl=true;return;}}for(int i=0;i<8;i++){int dx=x+mv[i][0],dy=y+mv[i][1];if(dx<1||dx>5) continue;if(dy<1||dy>5) continue;swap(mp[x][y],mp[dx][dy]);dfs(now+1,dx,dy);swap(mp[x][y],mp[dx][dy]);}
}
void clear(){fl=false;dp=0;
}
int main(){scanf("%d",&T);while(T--){clear();int sx,sy;for(int i=1;i<=5;i++){scanf("%s",st[i]+1);for(int j=1;j<=5;j++){if(isdigit(st[i][j]))mp[i][j]=st[i][j]-'0';else {mp[i][j]=2;sx=i,sy=j;}}}fl=false;for(dp=0;dp<=15;dp++){dfs(1,sx,sy);if(fl) break;}if(fl) printf("%d\n",dp);else printf("-1\n");}return 0;
}
View Code

 

转载于:https://www.cnblogs.com/Miracevin/p/9780322.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美团扫码付的前端可用性保障实践

开篇 2017年&#xff0c;美团金融前端遇到了很多通用性问题&#xff0c;特别是在保障前端可用性的过程中&#xff0c;我们团队也踩了不少“坑”&#xff0c;在梳理完这些问题以后&#xff0c;我们还专门做了第31期线下沙龙给大家进行了分享。不管是在面试过程中与候选人讨论&a…

Servlet上传文件和下载文件示例

Java Web应用程序中的文件上载和下载以及常见任务。 由于最近我写了很多有关Java servlet的文章 &#xff0c;因此我想提供一个使用servlet上传和下载文件的示例示例。 用例 我们的用例是提供一个简单HTML页面&#xff0c;客户端可以在其中选择要上传到服务器的本地文件。 在提…

java创建异步多线程_Java创建多线程异步执行实现代码解析

实现Runable接口通过实现Runable接口中的run()方法public class ThreadTest implements Runnable {public static void main(String[] args) {Thread thread new Thread(new ThreadTest());thread.start();}Overridepublic void run() {System.out.println("Runable 方式…

hive基本操作与应用

通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计&#xff0c;结果放在表word_count里 查看统计结果 转载于:https://www.cnblogs.com/cairuiqi/p/9048256.html

Apache log4j是领先的日志记录框架

根据 从零周转开始的调查中&#xff0c; Apache log4j是领先的Java日志记录框架。 这实际上是一个非常有趣的调查。 它显示SLF4J最常用作伐木外墙&#xff0c;占61&#xff05;。 但是&#xff0c;它似乎最常与Apache Log4j一起使用&#xff0c;52&#xff05;的调查参与者都…

Centos6.8通过yum安装mysql5.7

Centos6.8通过yum安装mysql5.7 2017年07月13日 14:19:10 阅读数&#xff1a;1067 1.安装mysql的yum源 a.下载配置mysql的yum源的rpm包 根据上面3张图片中的操作下载下来的rpm文件可以通过如下命令获取&#xff1a; wget https://dev.mysql.com/get/mysql57-community-release-e…

Mvc+Hui+SqlSugar+Autofac+NLog+T4 架构设计(一)

一、前言 作为小菜鸟第一次写博客的我还有点小激动&#xff0c;最近开始打算着手写一个属于自己架构。算下来差不多最近花一周多的下班时间了来写这个框架&#xff0c;本来想整体架构开发完成测试完成后才写博客&#xff0c;怕自己没时间或失去动力&#xff0c;就先把自己架构设…

房价在手,天下我有 --反手就撸一个爬虫(终)

接上篇&#xff0c;科科&#xff0c;好&#xff0c;我们继续 我们在这里先把json数据入库吧&#xff5e; 首先&#xff0c;database/scheme里定义好数据类型。 const mongoose require(mongoose)const detailHouseSchema new mongoose.Schema({ //定义数据模式link:String…

Spring MVC:带有CNVR卷的REST应用程序。 1个

不久前&#xff0c;我阅读了Paul Chapman撰写的有关内容协商视图解析器 &#xff08;CNVR&#xff09;的文章。 Spring Framework Blog上的那篇文章启发了我研究这个框架的领域。 因此&#xff0c;我开发了一个基于Spring MVC和CNVR的 REST示例应用程序。 该应用程序演示了REST…

《精通Spring 4.x 企业应用开发实战》学习笔记

第四章 IoC容器 4.1 IoC概述 IoC&#xff08;Inverse of Control 控制反转&#xff09;&#xff0c;控制是指接口实现类的选择控制权&#xff0c;反转是指这种选择控制权从调用类转移到外部第三方类或容器的手中。 也就是由Spring容器借由Bean配置来进行控制。 DI&#xff08;D…

微前端——无界wujie

B站课程视频 课程视频 课程课件笔记&#xff1a; 1.微前端 2.无界 现有的微前端框架&#xff1a;iframe、qiankun、Micro-app&#xff08;京东&#xff09;、EMP&#xff08;百度&#xff09;、无届 前置 初始化 新建一个文件夹 1.通过npm i typescript -g安装ts 2.然后可…

java executor spring_Spring+TaskExecutor实例

一 TaskExecutor接口Spring的TaskExecutor接口等同于Java.util.concurrent.Executor接口。 实际上&#xff0c;它存在的主要原因是为了在使用线程池的时候&#xff0c;将对Java 5的依赖抽象出来。 这个接口只有一个方法execute(Runnable task)&#xff0c;它根据线程池的语义和…

小程序居然可以用WXS模拟实现过滤器!

小程序目前官方还没有出过滤器&#xff0c;特别不方便&#xff0c;但是可以用wxs来模拟过滤器&#xff0c;话不多说&#xff0c;直接上代码。当然&#xff0c;不熟悉wxs的可以先看一下 官方文档 1.新建一个filter.wxs的文件我个人建议是一个过滤器写一个wxs&#xff0c;避免引用…

ADF:使用HTTP POST方法进行URL任务流调用

众所周知&#xff0c;可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ url-invoke-allowed”&#xff0c;则启用此功能&#xff0c;该功能通常在集成项目中使用。 通常&#xff0c;客户端&#xff08;或调用者&#x…

java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

一、缓存当系统的并发量上来了&#xff0c;如果我们频繁地去访问数据库&#xff0c;那么会使数据库的压力不断增大&#xff0c;在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题&#xff0c;用户访问进来&#xff0c;会先从缓存里查…

Spring MVC:带有CNVR卷的REST应用程序。 3

这是带有CNVR的Spring MVC REST教程的最后一部分。 在这里&#xff0c;我将演示所有这些东西如何工作&#xff0c;这是我在前两部分中开发的。 对于每种类型的CRUD操作&#xff0c;这将分为四个部分&#xff1a;CREATE&#xff0c;READ&#xff0c;UPDATE&#xff0c;DELETE。 …

java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

本文是Java IO总结系列篇的第4篇&#xff0c;前篇的访问地址如下&#xff1a;如果您阅读完成&#xff0c;觉得此文对您有帮助&#xff0c;请给我点个赞&#xff0c;您的支持是我不竭的创作动力。为了方便大家理解&#xff0c;我特意制作了本文对应的视频&#xff1a;总结删除文…

实现小程序canvas拖拽功能

组件地址 https://github.com/jasondu/wx-comp-canvas-drag 实现效果 如何实现 使用canvas使用movable-view标签 由于movable-view无法实现旋转&#xff0c;所以选择使用canvas 需要解决的问题 如何将多个元素渲染到canvas上如何知道手指在元素上、如果多个元素重叠如何知…

H5页面滚动阻尼效果实现

功能描述 要求 页面分为AB两个区域 当手机可视区的底部接触到 “阻尼带” 的时候&#xff0c;有个上拉弹性过程 当上拉到一定阈值程度就直接把B区顶部弹到手机可视区的顶部&#xff0c;让可视区从B区开始显示当上拉程度未到阈值&#xff0c;就回弹复原 当手机可视区从B区向上…

web 前端 html

1&#xff0c;什么是web 在网络中&#xff0c;大量的数据需要有一个载体&#xff0c;而很多人都能够访问这个载体&#xff0c;利用浏览器的这个窗口链接一个有一个载体&#xff0c;这个载体就是网站也就是web的前身。  1&#xff0c;web标准&#xff1a;结构标准&#xff0c;表…