洛谷p1146硬币翻转

算法 专栏收录该内容
23 篇文章 0 订阅

题目描述

在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上。现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N−1枚硬币(正面向上的被翻转为反面向上,反之亦然)。求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作)。

输入格式

一个自然数N(N为不大于100的偶数)。

输出格式

第一行包含一个整数S,表示最少需要的操作次数。接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,和1――反面向上,不允许出现多余空格)。

对于有多种操作方案的情况,则只需操作的字典序最小输出一种。

注:操作的字典序:对于一次操作,1表示翻转,0表示不反转。

但是需要你输出的是每一次操作完的状态,0表示正面朝上,1表示反面朝上。

输入输出样例

输入 #1

4

输出 #1

4
0111
1100
0001
1111

思路:

  1. 分析可知硬币翻转的次数和它的个数相同
  2. 上图吧:在这里插入图片描述

代码:


import java.util.Scanner;

public class pta1146 {
	public static void main(String [] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int cnt=0;              //计数
		int []a=new int[n];     //存储n个硬币的状态
		System.out.println(n);   //仔细分析会发现,硬币翻转的次数和它的个数相同,要不然无法在输出状态之前输出翻转次数
		for(int i=0;i<n;i++)
		{
			a[i]=0;              //初始化;正面为0;反面为1
		}
		for(int i=0;i<n;i++)     //控制翻转次数
		{
			for(int j=0;j<n;j++)   //控制每个硬币的翻转
			{
				if(j==cnt&&cnt%2==0)    //个数与次数相等,则保持不变
					a[j]=0;
				else if(j==cnt&&cnt%2==1)  //个数与次数相等,则保持不变
					a[j]=1;
				else                     //其他情况,翻转
				{
					if(a[j]==0)
						a[j]=1;
					else
						a[j]=0;
				}
			}
			cnt++;                         //翻转次数加一
			for(int t=0;t<n;t++)
			{
				System.out.print(a[t]);
			}
			System.out.println();             //换行
		}
		
	}

}
  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值