1硬币翻转
在桌面上有一排硬币,共N枚,每一枚硬币均为正面向上。现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚(正面向上的被翻转为反面向上,反之亦然)。
求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作。
输入:
只有一行,包含一个自然数N(N不大于是100的偶数)。
输出:
第一行包含一个整数S,表示最小需要的操作次数。接下来的S行每行分别表示每次操作后的硬币的状态(一行包含N个整数0或1),表示每个硬币的状态。0—正面向上,和1—反面向上,不允许出现多余空格。
对于多种操作方案的情况,则只输出一种。
样例:
INPUT
4
OUTPUT
4
0111
1100
0001
1111
//如果是想练习下BFS这道题也不错,不过最好是数学方法来做
//BFS,把状态转化成二进制,0代表正1代表反
//每次扩展都把所有的1变为0,把所有的0变为1,然后循环地选择一个再变回来。。个人感觉这样比较好操作。
//然后设计一个hash判重
//最后就可以结束了。
//最少步数是一样的,但是不同方法打印出来的步骤不一样
//下面是数学方法,不太好想但是很简单
/*
第1次,除了第1个,其它的都翻过来。
第2次,除了第2个,其它的都翻过来。
……
第n次,除了第n个,其它的都翻过来。
这样每个硬币都翻了n-1次。因为n是偶数,所以n-1为奇数。硬币原来朝上,翻了奇数次,所以就朝下了。
*/
#include<stdio.h>
int main()
{
int n,i,j,a[101]={-1},k=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
a[i]=0;
printf("%d\n", n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j==k)
{
a[j]=a[j];
}
else
{
if(a[j]==1)
{
a[j]=0;
}
else if(a[j]==0)
{
a[j]=1;
}
}
}
for(j=1;j<=n;j++)
printf("%d",a[j]);
printf("\n");
k++;
}
return 0;
}