前段时间,做了一个某游戏的辅助计算工具,其中遇到一个排列组合问题。抽象出来就是

将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条件的状态”的函数的更多相关文章

  1. 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别

    JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...

  2. 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容

    写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...

  3. 30 分钟开发一个简单的 watchOS 2 app <oneVcat>

    Apple Watch 和 watchOS 第一代产品只允许用户在 iPhone 设备上进行计算,然后将结果传输到手表上进行显示.在这个框架下,手表充当的功能在很大程度上只是手机的另一块小一些的显示器 ...

  4. 一个简单的P2P传输程序

    写了一个简单的P2P传输程序,在P2P的圈子中传输文件,不过为了简便,这个程序没有真正的传输文件,只是简单的判断一下文件的位置在哪里.这个程序可以处理当有一个peer闪退的情况,在这种情况下,剩下的p ...

  5. java学习之—实现一个简单的ArrayList

    package thread1; /** * 实现一个简单的ArrayList * * @Title: uminton */ public class SimpleArrayList<T> ...

  6. 创建一个简单的maven的web程序

    最近学习Hadoop,发现学习要想用hadoop作为后台运行web程序,必须应用maven,所以学习了今天学习了一下maven,然后搭建了一个简单的web程序 首先我使用的是eclipse中自带的ma ...

  7. 一个简单的NetCore项目:1 - 搭建框架,生成数据库

    1- 启动项目 安装.NETCORE SDK,教程在网上可以搜索的到,这里就不讲述了.简单粗暴的方式就是安装最新的VS2015. 2-搭建框架 2.1 打开VS新建一个项目,在弹出的新建项目对话框中, ...

  8. linux设备驱动第三篇:如何实现一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  9. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

随机推荐

  1. 003.Oracle数据库 , 查询日期格式格式化

    /*日期格式转换*/ SELECT TO_CHAR( OCCUR_DATE, 'yyyy/mm/dd hh24:mi:ss' ) FROM LM_FAULT WHERE ( ( OCCUR_DATE ...

  2. Oracle delete 之后恢复数据

    当我们粗心大意直接delete from不加条件而又没有回滚的时候有一个很简单的方法能够将数据恢复到delete之前的状态 第一种方案已经帮助我解决了实际问题.第二种方案暂未实践 在此记录下以便日后查 ...

  3. yolov3输出检测图片位置信息

    前言 我们在进行图片识别后需要进行进一步的处理,该文章会介绍:1.怎样取消lables;2.输出并保存(.txt)标记框的位置信息 一.去掉label 在darknet/src/image.c 收索d ...

  4. printf的封装与实现

    1 UART通信协议 1.1 UART通信的物理连接 图1 UART的物理连接 1.2 逻辑电平 用电平表示逻辑1和逻辑0,逻辑1和逻辑0用来组织计算机层面的数据. 1.3 电平标准 根据通讯使用的电 ...

  5. POJ 2823 滑动窗口 单调队列模板

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...

  6. UVA - 122 Trees on the level (二叉树的层次遍历)

    题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...

  7. POJ 2155:Matrix 二维树状数组

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 21757   Accepted: 8141 Descripti ...

  8. Python 比较 相等性 真值

    1 == 操作符测试 值 的相等性: is 测试对象的一致性.注意短字符串的is相等性测试,PVM会缓存短字符串,s1 is s2 将返回true. 2 false:"", [], ...

  9. 简单javascript学习总结

    2019-10-19 //文章汇总于绿叶学习网 console.log()                              //控制台输出 目录 数据类型:.... 2 函数:.... 3 ...

  10. 环境变量和文件查找&文件打包与解压缩

    环境变量和文件查找 介绍环境变量的作用与用法 及几种搜索文件的方法 学会这些技巧可以高效地使用 Linux 知识点:环境变量的设置 环境变量的修改 环境变量 要解释环境变量,得先明白变量是什么,准确的 ...