第七章 分治算法-1327:【例7.6】黑白棋子的移动

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

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3176 通过数: 1356
【题目描述】
有2n个棋子(n≥4)排成一行,开始位置为白子全部在左边,黑子全部在右边,如下图为n=5的情形:

○○○○○●●●●●

移动棋子的规则是:每次必须同时移动相邻的两个棋子,颜色不限,可以左移也可以右移到空位上去,但不能调换两个棋子的左右位置。每次移动必须跳过若干个棋子(不能平移),要求最后能移成黑白相间的一行棋子。如n=5时,成为:

○●○●○●○●○●

任务:编程打印出移动过程。

【输入】
输入n。

【输出】
移动过程。

【输入样例】
7
【输出样例】
step 0:ooooooo*******–
step 1:oooooo–o
step 2:oooooo
*–o*
step 3:ooooo–oo
step 4:ooooo
–oo
step 5:oooo–ooo
step 6:oooo
***–ooo*
step 7:ooo–oooo*
step 8:oooo**–ooo*
step 9:o–o**ooooo*
step10:ooo*–oooo
step11:–ooooooo*


思路:

第七章 分治算法-1327:【例7.6】黑白棋子的移动_第1张图片
把中间位置的一对黑白棋移到最右边。
把最左边的一对黑棋移到中间的空位上。
这就是分治的思想,将这个问题分解成了一个个子问题,这些问题就是要进行上面两步求解
n>4 和n==4 两种情况

 #include
 #include
 #include
 using namespace std;
 
 char a[101];
 int sp,step = 0,n;
 void print()
 {
 	printf("step%2d:",step);
 	for(int i = 0;i < 2 * n + 2;i++)
 	printf("%c",a[i]);
 	printf("\n");
 	step++;
  } 
  
  void mov(int k){
  	int j;
  	for(j = 0; j <2;j++)
  	{
  		a[sp + j] = a[k + j - 1];
  		a[k + j - 1]='-';
  		
	  }
	  sp = k - 1;
	  print();
  }
  
  
  void mv(int n){
  
  	if(n == 4)
  	{
  		mov(4);
  		mov(8);
  		mov(2);
  		mov(7);
  		mov(1);
	  }
	  else{
	  	mov(n);
	  	mov(2 * n -1);
	  	mv(n - 1);
	  }
  }
  
  int main(){
  	int i;
  	cin>>n;
  	for(i = 0;i < n;i++)
  	a[i]='o';
  	for(i=n;i < 2 * n;i++)
  	a[i] = '*';
  	a[2*n] = '-';
  	a[2*n + 1] = '-';
  	sp = 2 * n;
  	print();
  	mv(n);
  	return 0;
  }

你可能感兴趣的:(信息学C++,一本通)