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 }