硬币翻转
时间限制: 1 Sec 内存限制: 128 MB
提交: 43 解决: 29
[提交][状态][讨论版]
题目描述
在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上。现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然)。求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作)。
输入
输入只有一行,包含一个自然数N(N为不大于100的偶数)。
输出
第一行包含一个整数S,表示最少需要的操作次数。接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0——正面向上,和1——反面向上,不允许出现多余空格)。
对于有多种操作方案的情况,则只需输出一种。
对于有多种操作方案的情况,则只需输出一种。
样例输入
4
样例输出
4
0111
1100
0001
1111
【分析】第一次翻转左边第一个不变,第二次翻转左边第二个不变,第三次翻转左边第三个不变。。。。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <map> #include <queue> #include <stack> #include <vector> #include <list> #include<functional> #define mod 1000000007 #define inf 0x3f3f3f3f #define pi acos(-1.0) using namespace std; typedef long long ll; const int N=100005; const int M=15005; ll sum=1; int n,m,Q; int vis[N]; int a[N]; int dp[N][4]; int maxn=0; int main() { memset(a,0,sizeof(a)); scanf("%d",&n); for(int i=0; i<n; i++) { a[i]=0; } printf("%d ",n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(i!=j)a[j]=(a[j]+1)%2; printf("%d",a[j]); }printf(" "); } return 0; }