一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数
前段时间,做了一个某游戏的辅助计算工具,其中遇到一个排列组合问题。抽象出来就是
将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件,
请给出所有的这些状态。
随意找了下没有现成的,于是就自己写一个算了......
纠结了一段时间,发现其实就是一个普通的八皇后问题。
//将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态
//盒子状态使用长为box的数字字符串表示。
//limit为类似于"0110000"的数字字符串(其表示条件是第1位和第1位至少为1),其末尾的0可省略
//返回有盒子状态字符串组成的数组。
function ballInBox(ball,box,m,limit)
{
var t='';//存放盒子状态的临时变量
var t1='';//存放根据当前状态计算出下一步状态的临时变量
var r=[];//返回数据用数组
var s=[];//存放对应的r状态的盒子中球的总数
var s1=0;//存放从s中取出的第一个状态
var l=0;//储存r的长度的临时变量
//初始化t为一个长度为box的全0字符串
for(var i = 0;i<box;i++)
{
t+='0';
}
//初始化r
r.push(t);
s.push(0);
//console.log(r);
//console.log(s);
//循环ball次。模拟ball个球以此放入盒子,并使用r来承接每次模拟后的结果集。
//每次模拟是从r中取出一个n个球已知状态,并将第n+1个球放入,并将所有放入结果在送回r中。
//模拟放入时从前向后顺,
//因为球没有差别,如果发现该盒子中已经有球了,就判断该盒子是否能再装入球,同时该球不再模拟此状态(跳转到下一状态)
for(var i =0;i<ball;i++)
{
while(true)
{
//console.log(r);
//console.log(s);
//如果当前状态的球数大于本次循环的球数(i),表示本球已经遍历完成了,该模拟下一球了
if(s[0]>i)
break;
//将最头上的取出,并尝试在该状态基础上,将球依次放入其中的盒子。每成功一次就将成功后的结果存入r中。
//共循环box次,即最多把盒子都循环一边。但如果遇到已经有球的盒子,便尝试放入后退出循环
//为保持模版状态的纯洁度,使用t1作为临时变量
t=r.shift();
s1=s.shift();
for(var j=0;j<box;j++)
{
if(t[j]==0)
{
t1=t.split('');
t1[j]=1;
t1=t1.join('');
r.push(t1);
s.push((s1+1));
}
else if(t[j]<m)
{
t1=t.split('');
t1[j]=parseInt(t1[j])+1;
t1=t1.join('');
r.push(t1);
s.push((s1+1));
break;
}
else if(t[j]<=m)
{
break;
}
else
{
return false;
}
}
}
}
//最后根据limit参数再过滤一遍
if(limit)
{
for(var i=0;i<r.length;i++)
{
for(var j=0;j<limit.length;j++)
{
if(r[i][j]<limit[j])
{
r.splice(i,1);
s.splice(i,1);
i--;
break;
}
}
}
}
return r;
}
一个简单的“将ball个球放到box各盒子中,每个盒子不多于m个,并且满足limit条件的状态”的函数的更多相关文章
- 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别
JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...
- 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容
写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...
- 30 分钟开发一个简单的 watchOS 2 app <oneVcat>
Apple Watch 和 watchOS 第一代产品只允许用户在 iPhone 设备上进行计算,然后将结果传输到手表上进行显示.在这个框架下,手表充当的功能在很大程度上只是手机的另一块小一些的显示器 ...
- 一个简单的P2P传输程序
写了一个简单的P2P传输程序,在P2P的圈子中传输文件,不过为了简便,这个程序没有真正的传输文件,只是简单的判断一下文件的位置在哪里.这个程序可以处理当有一个peer闪退的情况,在这种情况下,剩下的p ...
- java学习之—实现一个简单的ArrayList
package thread1; /** * 实现一个简单的ArrayList * * @Title: uminton */ public class SimpleArrayList<T> ...
- 创建一个简单的maven的web程序
最近学习Hadoop,发现学习要想用hadoop作为后台运行web程序,必须应用maven,所以学习了今天学习了一下maven,然后搭建了一个简单的web程序 首先我使用的是eclipse中自带的ma ...
- 一个简单的NetCore项目:1 - 搭建框架,生成数据库
1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...
- linux设备驱动第三篇:如何实现一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- linux设备驱动第三篇:如何写一个简单的字符设备驱动?
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
随机推荐
- Metasploit学习笔记——Web应用渗透技术
1.命令注入实例分析 对定V公司网站博客系统扫描可以发现,它们安装了zingiri-web-shop这个含有命令注入漏洞的插件,到www.exploit-db.com搜索,可以看到2011.11.13 ...
- [U53204] 树上背包的优化
题目链接 本文旨在介绍树上背包的优化. 可见例题,例题中N,M∈[1,100000]N,M \in [1,100000]N,M∈[1,100000]的数据量让O(nm2)O(nm^2)O(nm2)的朴 ...
- Delphi 10.3.3 THTTPClient Post问题
如果对于Post提交,需要对参数进行urlEncode处理的需要注意. 对于Post参数,可以用TString或者TStringStream两者.如果你采用的是用TStringStream,那么必须按 ...
- POJ 2309:BST lowbit
BST Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9140 Accepted: 5580 Description C ...
- HihoCoder第九周 状态压缩 二 与POJ2411总结
在此我向各位博友求助,特别想知道除了HihoCoder上面的结果要对1e9+7取余之外,这两道题还有什么其他的问题,都是骨牌覆盖问题,都是状态压缩+dp,为什么我能过poj2411的程序过不了Hiho ...
- 文本编辑器vim/vi——模式切换及输入模式
vim一共有三种模式:命令模式.输入模式.末行模式 要从命令模式切换到输入模式:a,i,o a——append 属于在后面追加内容:i——insert 属于插入,在前面插入内容:o——other 属于 ...
- 中文文本分类之CharCNN
文本分类是自然语言处理中一个非常经典的任务,可用的模型非常多,相关的开源代码也非常多了.这篇博客用一个CNN模型,对新闻文本进行分类. 全部代码有4个模块:1.数据处理模块(命名为:cnews_loa ...
- plsql和navicat连接远程oracle(易错点)
plsql和navicat连接远程oracle,只需要安装oracle客户端即可.注意此处是oracle客户端(Instant Client),并不是oracle数据库. oracle客户端下载地址: ...
- Java交换数据为何不起作用原因分析
一.概述 目前各类语言中向函数传递参数的类型分为三种: 按值传递 按引用传递 按指针传递 其中按值传递表示方法(函数)接收的是调用者提供的变量的拷贝,不改变参数的值:按引用传递表示方法(函数)接收的调 ...
- linux项目,项目报错,排查
今天在遇到以前部署的项目突然没有数据了,然后就去服务器看了一下,打印日志发现报错了,现在我是一脸懵逼,因为不知道怎么排查 然后同事告诉说先看报错的原因,然后再去找认识的类,我打码的都是一些认识的 然后 ...