看到一个翻硬币题目,想了半天,不得其解,遂搜之...
发现这个博文写了几种思路,惊叹此人算法如此之好!
此处把几种思路以Java实现,特此记录...
http://blog.csdn.net/jia_xiaoxin/archive/2008/08/30/2852389.aspx
题目:
一摞硬币共有m枚,每一枚都是正面朝上。取
下最上面的一枚硬币,将它翻面后放回原处。然后取下最上面的2枚硬币,将他们一起翻面后再放回原处。再取3枚,取4枚……直至m枚。然后再从这摞硬币最上
面的一枚开始,重复刚才的做法。这样一直做下去,直到这摞硬币中的每一枚又都是正面朝上为止。例如,m为1时,翻两次即可。m为2时,翻3次即可;m为3
时,翻9次即可;m为4时,翻11次即可;m为5时,翻24次即可;…;m为30时,翻899次即可;…
输 入:
仅有的一个数
字
是这摞硬币的枚数m,0<m<1000。
输 出:
为了使这摞硬币中的每一枚又都是正面朝上所必
需翻的次数。
某单
元
格
输入:
30
某单元格等于:
899
思路:不管硬币的次序,只是记住每次的翻转和交换,硬币的初
始状态都是TRUE,每个COIN经过多伦的翻转后都变回TRUE,那么就求出了解,这是最简单的思路。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TurnCoin {
public static void turn(int m){
int turnTimes = 0;
boolean flag = false;
boolean[] coins = new boolean[m];
for(int i=0;i<m;i++){
coins[i] = true;
}
while(!flag){
for(int i=0;i<m;i++){
for(int j=0;j<(i+1)/2;j++){
boolean temp = coins[j];
coins[j] = !coins[i-j];
coins[i-j] = !temp;
}
if((i+1)%2 == 1){
coins[i/2] = !coins[i/2];
}
turnTimes = turnTimes + 1;
flag = true;
for(int n=0;n<m;n++){
if(coins[n] == false){
flag = false;
break;
}
}
if(flag){
break;
}
}
}
System.out.println(turnTimes);
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
turn(n);
}
}
待继....
分享到:
相关推荐
4. **翻硬币问题**:这是一个有趣的回溯问题,涉及翻转硬币以达到某个目标状态。 5. **8皇后问题**:这是另一个经典的回溯问题,目标是在8×8的棋盘上放置8个皇后,使得没有任何两个皇后在同一行、同一列或同一对角...
例如,解决“翻转硬币”或“阶乘后的零”这类问题时,数学知识将大有帮助。 5. **滑动窗口**:滑动窗口是处理数组或字符串问题的有效方法,它在处理范围限制的统计问题时特别有用。例如,“最大连续1的个数”或...
12. **概率论**:抛硬币是一个典型的概率问题,每次独立抛掷硬币,正面朝上的概率是固定的,不会因前几次的结果受到影响。 13. **平行四边形的性质**:平行四边形的对角相等,相邻角互补。题目中给出了一个角的度数...
LeetCode 是一个在线平台,专为程序员提供算法练习和面试准备。它涵盖了各种编程语言,如 C++,并提供...如果你打算深入研究,建议你逐个分析代码,理解其逻辑,尝试自己编写解决方案,并对比不同解法的效率和优雅性。
1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整数序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找...