看似简单,实则很绕人的堆栈问题 把1,2,3,4这四个数字分别放到栈里面,问有多少种放法,请用程序打印出来。每个数字最多放进去2次拿出来1次。上面的那个问题我已经想了3天了。还是没有头绪,越绕越郁闷了!!那个大哥能帮帮一下,最好能有个思路,小弟感激不尽啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有点想法,请大家参考下:请问是否可以看成 1,1,2,2,3,3,4,4的排列呢1.所有的排列(a1,a2,a3,a4,a5,a6,a7,a8)应该按位置顺序满足有1,2,3,4的例如:1,2,3,1,4,2,3,42.现在问题变为对于1,2,3,4中间插入(1,2,3,4),即: 现在把不动的1,2,3,4用A1,A2,A3,A4表示(A1=1,A2=2,A3=3,A4=4), 要插入的用b1,b2,b3,b4表示(值是1,2,3,4的不同排列)。 A4肯定要放到最后 A1 A2 A3 A4先只看每个数都拿2次的情况:1.(b1,b2,b3,b4)分别插入到A1 A2 A3的前面或后面2. (b1,b2)(b3,b4)分别插入到A1 A2 A3的前面或后面3.(b1,b2,b3)(b4)分别插入到A1 A2 A3的前面或后面说明一下:这里面肯定有相同的排列,我们把上面3步中的(b1,b2,b3,b4),(b1,b2)(b3,b4),(b1,b2,b3)(b4)理解为要拿出的数,虽然相同的排列,但是拿出数的顺序不一样,也应该不一样的再看只拿3个数,2个数,1个数的情况,所有满足上述条件的应该就是了初步理解,请大家指导?? 6楼的,你说的“所以直接把1放进栈里,然后把1拿出来,再放进栈里,接着放2,3,4”,可是1拿出来之后不一定就再马上放进去,它可以等2放进去后再放,等3放进去后再放。这样看来远远不止你说的8种,注意:是“每个数字”都可以“2出1进”我现在有个思路大家看看:前面不管你怎么放,只要是到栈的最顶层的那个数,它已经是“2出1进”,我们可以看成他是一次“OVER”,下面的思路还在整理中。。 我理解成:最终在栈上有4个数字(即可以有24种结果),需要求解的是达到这个目标的方法数。不知这种做法是否可行:不从数学上考虑,让程序做递归模拟。class StackProblem{ private ArrayList<StackEvent> actions; //操作序列 private StackEvent[] arrEvent; //当前状态可接受的事件 private byte[] digitStates; //记录每个数字的状态 /** 默认初始化,只要考虑第一步操作 */ StackProblem(){ //0,1,2,3分别表示未进栈,在栈中,已出栈,二次进栈 digitStates = new byte[]{0,0,0,0};//所有数字未进栈 //第一步操作,允许分别对数字1,2,3,4进栈 arrEvent = new StackEvent[]{new PushDigit(1), ... }; } /** 将event作用在问题last上,创建新的问题(状态) */ private StackProblem(StackProblem last, StackEvent event) { this(last);//类似拷贝构造,复制操作序列、状态等 applyEvent(event);//处理event,改变digitStates,actions arrEvent=getAvailableEvents();//获取当前状态下可操作步骤 } /** 针对事件列表中的每个事件,递归处理 */ void resolve() { for each event in arrEvent { problem = new StackProblem(this, event); problem.resolve(); } }}对于问题来说,StackEvent可以是push或pop,getAvailableEvents需要做的是判断下一步可以怎么操作;例如,第一步是数字3进栈,则第二步可以是3出栈或者1,2,4进栈4种方案;判断中,如果没有数字可进栈了,也就找到了一个解。 如何定义StringBuilder组 谁有工作流开发的源代码 为什么得不到同步,运行一次就挂了。 不知哪里出问题了? 这个问题很弱智,但我就是不会 请问java 的字符界面编程中怎么读取输入的String. 看书遇到两个问题,想不通,请帮忙解示一吓,谢谢~ 谁有JICQ的源代码,包括服务器端,数据库等!给我发一份! JavaMail中如何改变邮件状态? 谁有连接远程mysql的例子?看下列代码错在何处? 一个大问题。 SOCKET编程,如何设置它连接超时. 一个麻烦的问题,谁来帮我?
请问是否可以看成 1,1,2,2,3,3,4,4的排列呢1.所有的排列(a1,a2,a3,a4,a5,a6,a7,a8)应该按位置顺序满足有1,2,3,4的
例如:1,2,3,1,4,2,3,4
2.现在问题变为对于1,2,3,4中间插入(1,2,3,4),
即: 现在把不动的1,2,3,4用A1,A2,A3,A4表示(A1=1,A2=2,A3=3,A4=4),
要插入的用b1,b2,b3,b4表示(值是1,2,3,4的不同排列)。
A4肯定要放到最后
A1 A2 A3 A4
先只看每个数都拿2次的情况:
1.(b1,b2,b3,b4)分别插入到A1 A2 A3的前面或后面
2. (b1,b2)(b3,b4)分别插入到A1 A2 A3的前面或后面
3.(b1,b2,b3)(b4)分别插入到A1 A2 A3的前面或后面
说明一下:
这里面肯定有相同的排列,我们把上面3步中的(b1,b2,b3,b4),(b1,b2)(b3,b4),(b1,b2,b3)(b4)
理解为要拿出的数,虽然相同的排列,但是拿出数的顺序不一样,也应该不一样的
再看只拿3个数,2个数,1个数的情况,所有满足上述条件的应该就是了初步理解,请大家指导??
不知这种做法是否可行:不从数学上考虑,让程序做递归模拟。class StackProblem{
private ArrayList<StackEvent> actions; //操作序列
private StackEvent[] arrEvent; //当前状态可接受的事件
private byte[] digitStates; //记录每个数字的状态
/** 默认初始化,只要考虑第一步操作 */
StackProblem(){
//0,1,2,3分别表示未进栈,在栈中,已出栈,二次进栈
digitStates = new byte[]{0,0,0,0};//所有数字未进栈
//第一步操作,允许分别对数字1,2,3,4进栈
arrEvent = new StackEvent[]{new PushDigit(1), ... };
}
/** 将event作用在问题last上,创建新的问题(状态) */
private StackProblem(StackProblem last, StackEvent event) {
this(last);//类似拷贝构造,复制操作序列、状态等
applyEvent(event);//处理event,改变digitStates,actions
arrEvent=getAvailableEvents();//获取当前状态下可操作步骤
}
/** 针对事件列表中的每个事件,递归处理 */
void resolve() {
for each event in arrEvent {
problem = new StackProblem(this, event);
problem.resolve();
}
}
}对于问题来说,StackEvent可以是push或pop,getAvailableEvents需要做的是判断下一步可以怎么操作;例如,第一步是数字3进栈,则第二步可以是3出栈或者1,2,4进栈4种方案;判断中,如果没有数字可进栈了,也就找到了一个解。