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;
    }
}
原文地址:https://www.cnblogs.com/zhurb/p/5836614.html