2013年11月3日 星期日

[USACO][Serching] 1-4-2 The Clocks


/*
ID: 551100k1
LANG: C++
TASK: clocks
*/
#include<stdio.h>
#include<iostream>
#include<map>
#include<queue>
#include<vector>
using namespace std;
bool check(vector<int> v){
    int i;
    for(i=0;i<9;i++)
        if(v[i]!=12)
            return 0;
    return 1;
}
struct P{
    vector<int> X,Y;
}in,out;
int t[5][5][5][5][5][5][5][5][5];
vector<int> vec,s;
queue<P> que;
int main(){
    freopen("clocks.in","r",stdin);
    freopen("clocks.out","w",stdout);
    int i,j,n,m;
    for(i=0;i<9;i++)
        scanf("%d",&n),vec.push_back(n);
    in.X=vec;
    t[in.X[0]/3][in.X[1]/3][in.X[2]/3][in.X[3]/3][in.X[4]/3][in.X[5]/3][in.X[6]/3][in.X[7]/3][in.X[8]/3]=1;
    que.push((P){vec,s});
    while(que.size()){
        out=que.front();
        que.pop();
        if(check(out.X)) break;
        for(i=1;i<=9;i++){
            in=out;
            if(i==1) in.X[0]+=3,in.X[1]+=3,in.X[3]+=3,in.X[4]+=3,in.Y.push_back(1);
            if(i==2) in.X[0]+=3,in.X[1]+=3,in.X[2]+=3,in.Y.push_back(2);
            if(i==3) in.X[1]+=3,in.X[2]+=3,in.X[4]+=3,in.X[5]+=3,in.Y.push_back(3);
            if(i==4) in.X[0]+=3,in.X[3]+=3,in.X[6]+=3,in.Y.push_back(4);
            if(i==5) in.X[1]+=3,in.X[3]+=3,in.X[4]+=3,in.X[5]+=3,in.X[7]+=3,in.Y.push_back(5);
            if(i==6) in.X[2]+=3,in.X[5]+=3,in.X[8]+=3,in.Y.push_back(6);
            if(i==7) in.X[3]+=3,in.X[4]+=3,in.X[6]+=3,in.X[7]+=3,in.Y.push_back(7);
            if(i==8) in.X[6]+=3,in.X[7]+=3,in.X[8]+=3,in.Y.push_back(8);
            if(i==9) in.X[4]+=3,in.X[5]+=3,in.X[7]+=3,in.X[8]+=3,in.Y.push_back(9);
            for(j=0;j<9;j++)
                if(in.X[j]>12)
                    in.X[j]-=12;
            if(t[in.X[0]/3][in.X[1]/3][in.X[2]/3][in.X[3]/3][in.X[4]/3][in.X[5]/3][in.X[6]/3][in.X[7]/3][in.X[8]/3]==0){
                t[in.X[0]/3][in.X[1]/3][in.X[2]/3][in.X[3]/3][in.X[4]/3][in.X[5]/3][in.X[6]/3][in.X[7]/3][in.X[8]/3]=1;
                que.push(in);
            }
        }
    }
    printf("%d",out.Y[0]);
    for(i=1;i<out.Y.size();i++)
        printf(" %d",out.Y[i]);
    puts("");
}

沒有留言:

張貼留言