【9803】硬币翻转

Time Limit: 3 second
Memory Limit: 2 MB

【问题描述】

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

【输入格式】

    输入只有一行,包含一个自然数N(N为不大于100的偶数)。

【输出格式】

    输出文件的第一行包含一个整数S,表示最少需要的操作次数。接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0——正面向上,和1——反面向上,不允许出现多余空格)。 对于有多种操作方案的情况,则只需输出一种。

【输入样例】

    4

【输出样例】

    4
    0111
    1100
    0001
    1111

【题解】

//广搜方法,苦于不知道怎么表示状态,所以放弃了。

进行n次操作。

每一次,都有一个硬币不翻转。

那么每个硬币就都会被操作n-1次,而n是一个偶数。则n-1是奇数。

所以最后所有的硬币都会被操作奇数次。因此全都向上了。

【代码】

#include <cstdio>

int n,ss[101];

int main()
{
	scanf("%d",&n);
	printf("%d\n",n);
	for (int i =1;i <= n;i++)
		ss[i] = 0;
	for (int i =1;i <= n;i++)
		{
			for (int j = 1;j<= n;j++)
				if (i!=j) //表示第i个硬币这一次操作不翻转 
					ss[j] = 1-ss[j]; //这是一个翻转的技巧 
			for (int j =1;j<= n;j++)
				printf("%d",ss[j]); //输出 
			printf("\n");
		}
	return 0;	
}


posted @ 2017-10-06 19:23  AWCXV  阅读(164)  评论(0编辑  收藏  举报