`

翻硬币多种解法

阅读更多

看到一个翻硬币题目,想了半天,不得其解,遂搜之...

发现这个博文写了几种思路,惊叹此人算法如此之好!

此处把几种思路以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个皇后,使得没有任何两个皇后在同一行、同一列或同一对角...

    leetcode:leetcode转换记录

    例如,解决“翻转硬币”或“阶乘后的零”这类问题时,数学知识将大有帮助。 5. **滑动窗口**:滑动窗口是处理数组或字符串问题的有效方法,它在处理范围限制的统计问题时特别有用。例如,“最大连续1的个数”或...

    江苏省无锡市锡北片2015-2016学年八年级数学下学期期中试题苏科版.doc

    12. **概率论**:抛硬币是一个典型的概率问题,每次独立抛掷硬币,正面朝上的概率是固定的,不会因前几次的结果受到影响。 13. **平行四边形的性质**:平行四边形的对角相等,相邻角互补。题目中给出了一个角的度数...

    LeetCode:我完成的每个LeetCode问题的文件

    LeetCode 是一个在线平台,专为程序员提供算法练习和面试准备。它涵盖了各种编程语言,如 C++,并提供...如果你打算深入研究,建议你逐个分析代码,理解其逻辑,尝试自己编写解决方案,并对比不同解法的效率和优雅性。

    世界500强面试题.pdf

    1.2.7. 翻转句子中单词的顺序....................................................................... 31 1.2.8. 判断整数序列是不是二元查找树的后序遍历结果 ................................ 33 1.2.9. 查找...

Global site tag (gtag.js) - Google Analytics