有N个硬币(N为偶数)正面朝上排成一排,每次将 N-1 个硬币翻过来放在原位置,
不断地重复上述过程,直到最后全部硬币翻成反面朝上为止。
编程让计算机把翻币的最简过程及翻币次数打印出来(用*代表正面,O 代表反面)。
[C#]
private const int N = 10;
public static void Main(String[] args)
{
bool[] a = new bool[N];
int i, j;
for (i = 0; i < N; i++)
{
Console.Write("{0,3}", '*');
a[i] = true;
}
Console.Write("/n");
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (i != j)
a[j] = !a[j];
Console.Write("{0,3}", a[j] ? '*' : 'o');
}
Console.WriteLine();
}
Console.ReadLine();
}
[C++]
#include <stdlib.h>
#include "stdio.h"
#include "math.h"
#include "assert.h"
#include "string.h"
#define N 12
void main()
{
assert(!(N%2));
bool s[N];
int i, j;
for(j = 0; j < N; j++)
{
s[j] = true;
printf("%3c", '*');
}
printf("/n");
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(j != i)
s[j] = !s[j];
printf("%3c", s[j]?'*':'0');
}
printf("/n");
}
system("pause");
}
========== 2 ==========
// 一共需要翻n次,每次都有一枚不翻转,但这一枚是不重复的
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
void Solve(int n)
{
int i,j;
int state[MAX] = {0}; // 记录硬币状态,state[i]=0表示第i枚硬币是正面向上
// 输出初始状态
for(j=0;j<n;++j)
putchar(state[j]?'0':'*');
putchar('/n');
for(i=0;i<n;++i) // 一共翻次
{
for(j=0;j<i;++j)
state[j] = !state[j]; // 翻转i以前的
for(j=i+1;j<n;++j)
state[j] = !state[j]; // 翻转i以后的
// 如此,只有第i枚没翻转
// 现在输出当前状态
for(j=0;j<n;++j)
putchar(state[j]?'0':'*');
putchar('/n');
}
}
int main(void)
{
int n;
scanf("%d",&n);
Solve(n);
system("pause");
}