首页 > 代码库 > POJ_1166_暴搜

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;    }}

 

POJ_1166_暴搜