原理:部分遍历确定整体
一:建立题目给出操作效果
二:遍历前三
三:依前三操作456,后得出789
因为前三操作完,能动A钟只有4,能动B钟只有5,能动C钟只有6
依次确定456,确定完后同理可确定789。
根本确定为何是前三,怎么划分部分:有部分确定整体的思想后,在相互牵连影响复杂的情况下,从1开始试,1不行就2,2不行再3。而在上题复杂密码锁中牵连情况过于简单,只会影响两侧所以1就已经解决了问题,若想深入理解,请试试想想“2”,“3”的各种情况会是什么样的效果。
故是以牵连复杂程度,一个一个试出来的。
#include <iostream>
using namespace std;
void Addsort(int num , int a[] );//该时钟加一,对其他时钟的影响
void add(int* p);//时钟加一
void CopyTo(int a[] , int b[]);
int main(){
int a[9] , b[9] , sum[9] , minmove[9] , min = 36;
for(int i = 0;i < 9;i++){
scanf("%d" , &a[i]);
minmove[i] = 4;
}
for(int i = 0;i < 4;i++){
for(int i = 0;i < 9;i++){
sum[i] = 0;
}
CopyTo(a ,b);
for(int num = 0;num < i;num++){
Addsort(1 , b);
sum[0]++;
}
for(int j = 0;j < 4;j++){
int sum1[9] , temp[9];
CopyTo(b , temp);
CopyTo(sum , sum1);
for(int num = 0;num < j;num++){
Addsort(2 , temp);
sum1[1]++;
}
for(int x = 0;x < 4;x++){
int sum2[9] , c[9];
CopyTo(temp ,c);
CopyTo(sum1 , sum2);
for(int num = 0;num < x;num++){
Addsort(3 , c);
sum2[2]++;
}
int sort;
sort = (4 - c[0])%4;
for(int i = 0;i < sort;i++){
Addsort(4 , c);
sum2[3]++;
}
sort = (4 - c[1])%4;
for(int i = 0;i < sort;i++){
Addsort(5 , c);
sum2[4]++;
}
sort = (4 - c[2])%4;
for(int i = 0;i < sort;i++){
Addsort(6 , c);
sum2[5]++;
}
sort = (4 - c[3])%4;
for(int i = 0;i < sort;i++){
Addsort(7 , c);
sum2[6]++;
}
sort = (4 - c[6])%4;
for(int i = 0;i < sort;i++){
Addsort(8 , c);
sum2[7]++;
}
sort = (4 - c[7])%4;
for(int i = 0;i < sort;i++){
Addsort(9 , c);
sum2[8]++;
}
if(c[4] == 0 && c[5] == 0 && c[8] == 0 ){
int sum = 0;
for(int i = 0;i < 9;i++){
sum += sum2[i];
}
if(sum < min){
CopyTo(sum2 , minmove);
min = sum;
}
}
}
}
}
for(int i = 0;i < 9;i++){
if(minmove[i] != 0){
for(int j = 0;j < minmove[i];j++){
printf("%d " , i+1);
}
}
}
return 0;
}
void CopyTo(int a[] , int b[]){
for(int i = 0;i < 9;i++){
b[i] = a[i];
}
}
void add(int* p){
if(*p == 3){
*p = 0;
}else{(*p)++;}
}
void Addsort(int num , int a[] ){
switch (num){
case 1:
add(a);
add(a+1);
add(a+3);
add(a+4);
break;
case 2:
add(a);
add(a+1);
add(a+2);
break;
case 3:
add(a+1);
add(a+2);
add(a+4);
add(a+5);
break;
case 4:
add(a);
add(a+6);
add(a+3);
break;
case 5:
add(a+1);
add(a+3);
add(a+4);
add(a+5);
add(a+7);
break;
case 6:
add(a+2);
add(a+5);
add(a+8);
break;
case 7:
add(a+3);
add(a+4);
add(a+6);
add(a+7);
break;
case 8:
add(a+6);
add(a+7);
add(a+8);
break;
case 9:
add(a+7);
add(a+8);
add(a+4);
add(a+5);
break;
}
}