POJ1166 - The Clocks(拨钟问题)题解
题目链接拨钟问题
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9
下图是9种移动会影响的时钟。
这道题还是枚举来解决,不要问我怎么想出来的,因为这是枚举的课后习题。
直接暴力枚举9种移动,判断是否都指向了12点。
放心,最多就是4^9次循环,小的很。
Then show the code.
#include <cstdio>
void OutputResult(int i, int &count){
printf("%d", i);
if(count > 1)
printf(" ");
count--;
}
int main(){
//a数组存放初始时钟状况
//b数组存放1-9个按钮被按下了多少次
//c数组存放按钮按下后时钟状况
int a[10], b[10], c[10] = {0};
for(int i = 1; i <= 9; i += 3){
scanf("%d %d %d", &a[i], &a[i+1], &a[i+2]);
}
for(b[1] = 0; b[1] < 4; b[1]++)
for(b[2] = 0; b[2] < 4; b[2]++)
for(b[3] = 0; b[3] < 4; b[3]++)
for(b[4] = 0; b[4] < 4; b[4]++)
for(b[5] = 0; b[5] < 4; b[5]++)
for(b[6] = 0; b[6] < 4; b[6]++)
for(b[7] = 0; b[7] < 4; b[7]++)
for(b[8] = 0; b[8] < 4; b[8]++)
for(b[9] = 0; b[9] < 4; b[9]++){
c[1] = (a[1] + b[1] + b[2] + b[4])%4;
c[2] = (a[2] + b[1] + b[2] + b[3] + b[5])%4;
c[3] = (a[3] + b[2] + b[3] + b[6])%4;
c[4] = (a[4] + b[1] + b[4] + b[5] + b[7])%4;
c[5] = (a[5] + b[1] + b[3] + b[5] + b[7] + b[9])%4;
c[6] = (a[6] + b[3] + b[5] + b[6] + b[9])%4;
c[7] = (a[7] + b[4] + b[7] + b[8])%4;
c[8] = (a[8] + b[5] + b[7] + b[8] + b[9])%4;
c[9] = (a[9] + b[6] + b[8] + b[9])%4;
//如果时钟都到达12点 那么c数组的元素都应该为0
if((c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]) == 0){
int count = b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9];
for(int i = 0; i < b[1]; i++) OutputResult(1, count);
for(int i = 0; i < b[2]; i++) OutputResult(2, count);
for(int i = 0; i < b[3]; i++) OutputResult(3, count);
for(int i = 0; i < b[4]; i++) OutputResult(4, count);
for(int i = 0; i < b[5]; i++) OutputResult(5, count);
for(int i = 0; i < b[6]; i++) OutputResult(6, count);
for(int i = 0; i < b[7]; i++) OutputResult(7, count);
for(int i = 0; i < b[8]; i++) OutputResult(8, count);
for(int i = 0; i < b[9]; i++) OutputResult(9, count);
return 0;
}
}
return 0;
}
不忘初心方得始终