從反面去想會比較簡單:全部扣掉不用扣的,即為需要移動的步數。
字典順序:
可以把他想成每次都從最小的開始排起
ex: 1 2 3 4 下一個是 1 2 4 3、1 4 2 3 ....
ex: BCD 下一個是 BDC、CBD
我的寫法並不是很好, 全部一個一個列出來~
#include <stdio.h>
#include <stdlib.h>
int main(void){
int color[3][3]={0};
int i,j;
char buf[4]={0};
int total,minMove,temp;
/*BGC*/
while(scanf("%d %d %d",&color[0][0],&color[0][1],&color[0][2])!=EOF){
total = color[0][0] + color[0][1] + color[0][2];
for(i=1;i<3;++i){
for(j=0;j<3;++j){
scanf("%d",&color[i][j]);
total += color[i][j];
}
}
minMove=total;
/*BCG*/
temp = total - color[0][0] - color[1][2] - color[2][1];
if(temp < minMove){
minMove = temp;
strcpy(buf,"BCG");
}
/*BGC*/
temp = total - color[0][0] - color[1][1] - color[2][2];
if(temp < minMove){
minMove = temp;
strcpy(buf,"BGC");
}
/*CBG*/
temp = total - color[0][2] - color[1][0] - color[2][1];
if(temp < minMove){
minMove = temp;
strcpy(buf,"CBG");
}
/*CGB*/
temp = total - color[0][2] - color[1][1] - color[2][0];
if(temp < minMove){
minMove = temp;
strcpy(buf,"CGB");
}
/*GBC*/
temp = total - color[0][1] - color[1][0] - color[2][2];
if(temp < minMove){
minMove = temp;
strcpy(buf,"GBC");
}
/*GCB*/
temp = total - color[0][1] - color[1][2] - color[2][0];
if(temp < minMove){
minMove = temp;
strcpy(buf,"GCB");
}
printf("%s %d\n",buf,minMove);
}
return 0;
}
沒有留言:
張貼留言