1327:【例7.6】黑白棋子的移动

黑白棋子的移动

当左边连续白棋还有一定数量时(>4),每次移动其实是一样的方式。(16、23行)

当按照这种固定的方式进行移动后,除去移动好了的棋子整个棋盘可以看作是原棋盘的子集。

至于左边白棋数量等于4时,就可以当做临界条件特殊处理。(16、18、19、20、21行)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<iomanip>
 4 using namespace std;
 5 
 6 const int N=1005;
 7 char cc[N];
 8 int n,step;
 9 string ss[N];
10 void move(int i,int j){
11     swap(cc[i],cc[j]);
12     swap(cc[i+1],cc[j+1]);
13     ss[step++]=cc+1;
14 }
15 void dac(int d,int e){
16     move(d,e);
17     if(d==4){
18         move(d,e-1);
19         move(d-2,e-1);
20         move(d-2,e-2);
21         move(d-3,e-2);
22     }else{
23         move(d,e-2);
24         dac(d-1,e-2);
25     }
26 }
27 int main(){
28     cin>>n;
29     //初始化
30     for(int i=1;i<=n;i++)cc[i]='o';
31     for(int i=n+1;i<=2*n;i++)cc[i]='*';
32     cc[2*n+1]=cc[2*(n+1)]='-';
33     move(1,1);
34     dac(n,2*n+1);
35     for(int i=0;i<step;i++)
36         cout<<"step"<<setw(2)<<i<<":"<<ss[i]<<endl;
37     return 0;
38 }

 

posted @ 2021-08-11 13:38  Rekord  阅读(651)  评论(0编辑  收藏  举报