有黑白棋子各有N个(分别用*和O代替),按下图方式排列
***...***OOO...OOO
N个黑棋 N个白棋
允许将相邻两个棋子互换位置,最后使队形成黑白交替排列,试编程实现该操作。
[C#]
private const int N = 9;
public static void Main(String[] args)
{
int[] a = new int[N * 2];
int i,j,k;
for (i = 0; i < N; i++)
a[i] = 1;
for (i = N; i < N * 2; i++)
a[i] = 0;
Console.Write("Begin :");
for (i = 0; i < N*2; i++)
Console.Write("{0,2}", i<N?'*':'o');
Console.Write("/n");
for (i = 1; i < N; i++)
{
j = 0;
while (j < 2 * N - 1)
{
if (a[j] != a[j + 1])
{
k = a[j];
a[j] = a[j + 1];
a[j + 1] = k;
j += 2;
}
else
j += 1;
}
Console.Write("Step {0,2}:",i);
for (j = 0; j < 2 * N; j++)
Console.Write("{0,2}", a[j] == 1 ? '*' : 'o');
Console.Write("/n");
}
Console.Write("Result :");
for (i = 0; i < 2 * N; i++)
Console.Write("{0,2}", a[i]==1?'*':'o');
Console.ReadLine();
}
[C++]
// 一共需要翻n次,每次都有一枚不翻转,但这一枚是不重复的
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
char state[MAX*2+1];
// Move
// 把第end位置的棋子交换到第start位置
// 其他棋子依次向后移动一个位置
void Move(int start, int end)
{
while( end > start )
{
int tmp = state[end];
state[end] = state[end-1];
state[end-1] = tmp;
puts(state);
--end;
}
}
void Solve(int n)
{
int i;
puts(state);
for(i=1;i<n;++i)
Move(i*2-1,n+i-1);
}
int main(void)
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;++i)
state[i] = '*';
for(i=n;i<n*2;++i)
state[i] = '0';
state[i] = '/0';
Solve(n);
system("pause");
}