POJ_1166_暴搜
题目描述:
有3*3的9个时钟,每个始终有0,1,2,3四种可以循环的状态码,每组数据给我们9个时钟的一种状态码。另外还有9种操作,分别使指定位置的时钟状态码加一,求使得9个时钟状态码全部置于0的最少操作数。
思路:
可以得知,每种操作数若执行了四次,则等同于不操作,所以每种操作数的次数在0-3之间,另外,题目明确告诉我们,每种状态只有一种答案。4^9,数据规模不大,把9种操作对应的位置存入一个数组,直接爆搜,也不用考虑什么情况。
后来想了一下,这题应该可以用高斯消元做,效率可以提高很多。
最后的输出格式多了一个空格,要处理的话比较麻烦,提交竟然AC了。
#include<cstdio> #include<iostream> using namespace std; int move[10][10] = {{},{0,1,1,0,1,1,},{0,1,1,1,},{0,0,1,1,0,1,1},{0,1,0,0,1,0,0,1,},{0,0,1,0,1,1,1,0,1,}, {0,0,0,1,0,0,1,0,0,1},{0,0,0,0,1,1,0,1,1,},{0,0,0,0,0,0,0,1,1,1},{0,0,0,0,0,1,1,0,1,1}}; int main() { int a[10]; for(int i = 1;i <= 9;i++) cin >> a[i]; int i1,i2,i3,i4,i5,i6,i7,i8,i9; for(i1 = 0;i1 <= 3;i1++) for(i2 = 0;i2 <= 3;i2++) for(i3 = 0;i3 <= 3;i3++) for(i4 = 0;i4 <= 3;i4++) for(i5 = 0;i5 <= 3;i5++) for(i6 = 0;i6 <= 3;i6++) for(i7 = 0;i7 <= 3;i7++) for(i8 = 0;i8 <= 3;i8++) for(i9 = 0;i9 <= 3;i9++) { int flag = 0; for(int j = 1;j <= 9;j++) { int sum = a[j]; sum += i1*move[1][j]+i2*move[2][j]+i3*move[3][j] +i4*move[4][j]+i5*move[5][j]+i6*move[6][j] +i7*move[7][j]+i8*move[8][j]+i9*move[9][j]; if(sum%4) { flag = 1; break; } } if(flag) continue; while(i1--) cout << "1 "; while(i2--) cout << "2 "; while(i3--) cout << "3 "; while(i4--) cout << "4 "; while(i5--) cout << "5 "; while(i6--) cout << "6 "; while(i7--) cout << "7 "; while(i8--) cout << "8 "; while(i9--) cout << "9 "; cout << endl; return 0; } }