当确定盘数为n时,它所需要进行操作的次数就确定为2^n-1
当n是偶数时
1)奇数步骤一定有a->b,b->c,c->a,a->b的重复顺序输出
2)偶数步骤一定有固定的7对序对输出顺序,为
a->c,a->b,c->b,a->c,b->a,b->c,a->c
当n是奇数时
1)奇数步骤一定有a->c,c->b,b->a,a->c的重复顺序输出
2)步骤为2,2+4,2+4+4…一定有a->b,b->c,c->a,a->b的重复顺序输出
3)步骤为4的倍数时一定有7个对固定输出顺序,为
a->c,a->b,c->b,a->c,b->a,b->c,a->c
代码实现
#include<stdio.h>
#include<math.h>
void Oushu(int n){
char begin[7]={'a','a','c','a','b','b','a'};
char end[7]={'c','b','b','c','a','c','c'};
char first='a';
int mark=0;
for(int i=1; i<=n; i++){
if(i%2!=0){
if(first+1=='d'){
printf("c -> a\n");
first='a';
}else{
printf("%c -> %c\n",first,first+1);
first++;
}
}else{
printf("%c -> %c\n",begin[mark],end[mark]);
mark++;
if(mark==7){
mark=0;
}
}
}
}
void Jishu(int n){
char begin[7]={'a','a','c','a','b','b','a'};
char end[7]={'c','b','b','c','a','c','c'};
char first='a',seconed='a',third='a';
int contr=2;
int mark=0;
for(int i=1; i<=n; i++){
if(i%2!=0){
if(first=='a'){
printf("%c -> %c\n",first,first+2);
first='c';
}else{
printf("%c -> %c\n",first,first-1);
first--;
}
}else if(i==contr){
contr+=4;
if(seconed+1=='d'){
printf("c -> a\n");
seconed='a';
}else{
printf("%c -> %c\n",seconed,seconed+1);
seconed++;
}
}else{
printf("%c -> %c\n",begin[mark],end[mark]);
mark++;
if(mark==7){
mark=0;
}
}
}
}
int main(){
int n;
scanf("%d",&n);
int temp=n;
n=pow(2,n)-1;
if(temp%2==0){
Oushu(n);
}else{
Jishu(n);
}
return 0;
}
注意:该代码用int类型进行计算循环次数,但int范围不够,所以可测数据有限,这里只是提供这个规律。。。。