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); 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(" "); } return 0; }