题目链接
http://www.luogu.org/problem/show?pid=1259#
http://codevs.cn/problem/2230/
题目描述
有2n个棋子(n≥4)排成一行,开始为位置白子全部在左边,黑子全部在右边,如下图为n=5的情况:
○○○○○●●●●●
移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:
○●○●○●○●○●
任务:编程打印出移动过程。
输入输出格式
输入格式:
一个整数n(n<=50)
输出格式:
若干行,表示初始状态和每次移动的状态,用"o"表示白子,"x"表示黑子,"-"表示空行。
输入输出样例
输入样例#1:
7
输出样例#1:
ooooooo*******-- oooooo--******o* oooooo******--o* ooooo--*****o*o* ooooo*****--o*o* oooo--****o*o*o* oooo****--o*o*o* ooo--***o*o*o*o* ooo*o**--*o*o*o* o--*o**oo*o*o*o* o*o*o*--o*o*o*o* --o*o*o*o*o*o*o*
思路
分析样例数据可以看到,在最前方的白棋还剩下三个以上时,我们可以把最后一个白棋和其后的第一个黑棋一起移动到空格的位置,输出,然后把最后两个黑棋移动到空格的位置,输出。在最前方的白棋还剩下3个时,继续这样的方法就不适用了。因为无论如何都会到达还剩三步的状态,所以寻找规律直接输出最后几行即可。
四个指针的作用:l:连续的最后一个白棋出现的位置;h:连续的最后一个黑棋出现的位置;j第一个空格的位置;k:最后一个空格的位置


var a:array[1..10000] of char; n,i,j,k,l,h,x,y:longint; procedure printf; var i:longint; begin for i:=1 to 2*n+2 do write(a[i]); writeln; end; begin readln(n); for i:=1 to n do a[i]:='o'; for i:=n+1 to n*2 do a[i]:='*'; a[2*n+1]:='-'; a[2*n+2]:='-'; printf; l:=n;//last'o' h:=2*n;//last'*' j:=2*n+1;k:=2*n+2;//'-' while l>3 do begin a[j]:=a[l]; a[k]:=a[l+1]; a[l]:='-'; a[l+1]:='-'; printf; a[l]:='*'; a[l+1]:='*'; a[h]:='-'; a[h-1]:='-'; if l<>4 then printf; k:=h; j:=h-1; dec(l); dec(h,2); end; write('ooo*o**--*'); for i:=1 to n-4 do write('o*'); writeln; write('o--*o**oo*'); for i:=1 to n-4 do write('o*'); writeln; write('o*o*o*--o*'); for i:=1 to n-4 do write('o*'); writeln; write('--o*o*o*o*'); for i:=1 to n-4 do write('o*'); writeln; end.
当然,你也可以机(wu)智(chi)地寻找字符串之间的规律然后输出,虽然本人对于这种乱搞的做法表示十分愤慨,不过还是给大家把代码贴上。


program st; var n,i,j:longint; begin read(n); for j:=0 to 2*(n-3)-1 do begin //write('step ',j,':'); for i:=1 to n-(j+1) div 2 do write('o'); if j mod 2 <>0 then write('--'); for i:=1 to n-(j+1) div 2 do write('*'); if j mod 2 =0 then write('--'); for i:=1 to (j+1) div 2 do write('o*'); writeln; end; // write('step ',j+1,':'); write('ooo*o**--*'); for i:=1 to n-4 do write('o*'); writeln; // write('step ',j+2,':'); write('o--*o**oo*'); for i:=1 to n-4 do write('o*'); writeln; // write('step ',j+3,':'); write('o*o*o*--o*'); for i:=1 to n-4 do write('o*'); writeln; //write('step ',j+4,':'); write('--o*o*o*o*'); for i:=1 to n-4 do write('o*'); writeln; end.