[IOI1994] 时钟 - 搜索

考虑九个安排在 \(3 \times 3\) 矩阵中的时钟,每个时钟只会指向 \(3,6,9,12\) 点。有 \(9\) 种操作方式,每种操作方式规定了其固定的操作对象集合,将这几个时钟都往后拨 \(3\) 小时。每种操作方式有一个数字编号。求最小字典序的操作序列使得所有时钟都指向 \(12\) 点。

Solution

每个操作执行的次数不大于 \(3\)

操作序列由操作多重集得到

暴力枚举得到多重集

#include <bits/stdc++.h>
using namespace std;

int a[10];

signed main() {
    for(int i=1;i<=9;i++) cin>>a[i], a[i]/=3;
    for(int i1=0;i1<=3;i1++)
    for(int i2=0;i2<=3;i2++)
    for(int i3=0;i3<=3;i3++)
    for(int i4=0;i4<=3;i4++)
    for(int i5=0;i5<=3;i5++)
    for(int i6=0;i6<=3;i6++)
    for(int i7=0;i7<=3;i7++)
    for(int i8=0;i8<=3;i8++)
    for(int i9=0;i9<=3;i9++) {
        if((a[1]+i1+i2+i4)%4) continue;
        if((a[2]+i1+i2+i3+i5)%4) continue;
        if((a[3]+i2+i3+i6)%4) continue;
        if((a[4]+i1+i4+i5+i7)%4) continue;
        if((a[5]+i1+i3+i5+i7+i9)%4) continue;
        if((a[6]+i3+i5+i6+i9)%4) continue;
        if((a[7]+i4+i7+i8)%4) continue;
        if((a[8]+i5+i7+i8+i9)%4) continue;
        if((a[9]+i6+i8+i9)%4) 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<<" ";
        return 0;
    }
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12470780.html