现在的位置: 首页 > 综合 > 正文

usaco The clocks

2018年04月23日 ⁄ 综合 ⁄ 共 1769字 ⁄ 字号 评论关闭

确实usaco连续两次恶心我了,debug了一下午,最后竟然是定义顺序问题,我对C++也许理解太少,也许该失望???

code

/*
ID: yueqiq
PROG: clocks
LANG: C++
*/
#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <limits>
#include <vector>
#include <bitset>
#include <string>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <string.h>
#include <iostream>
#include <algorithm>
#define Si set<int>
#define LL long long
#define pb push_back
#define PS printf(" ")
#define Vi vector<int>
#define LN printf("\n")
#define lson l,m,rt << 1
#define rson m+1,r,rt<<1|1
#define SD(a) scanf("%d",&a)
#define PD(a) printf("%d",a)
#define SET(a,b) memset(a,b,sizeof(a))
#define FF(i,a) for(int i(0);i<(a);i++)
#define FD(i,a) for(int i(a);i>=(1);i--)
#define FOR(i,a,b) for(int i(a);i<=(b);i++)
#define FOD(i,a,b) for(int i(a);i>=(b);i--)
#define readf freopen("clocks.in","r",stdin)
#define writef freopen("clocks.out","w",stdout)
const int maxn = 20005;
const int INF = 1111;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
const double pi = acos(-1.0);
using namespace std;
/**ans为最终结果,tmp记录搜索路径,lim记录下每种操作的次数
    min_len为已经搜索到的最短路径,src为当前状态

    src 用二进制数代替,
    12时000,3时001,6时010,9时011
    12时为0,9时为3,6时为2,3时为1
*/
int min_len=INF;//i ca your sister!!!
//真心不懂为什么把min_len这个变量定义在这就对了,定义在下面就错了??
int ans[28]={-1},tmp[28]={-1},lim[9];
const int deal[9]={18911232,19136512,2363904,16810048,2134536,262657,36936,73,4617};
const int CLR = 57521883;
void dfs(int tmp[],int src,int lim[],int len,int st){
    if(len >min_len) return ;

    if(src==0){
        if(len==min_len){
            FF(i,len){
                if(tmp[i]>ans[i]) return ;
            }
        }
        min_len=len;
        FF(i,len){
            ans[i]=tmp[i];
        }
        return ;
    }

    FOR(i,st,8){
        if(lim[i]<3){
            int t=src;

            src=(src+deal[i])&CLR;
            tmp[len++]=i;
            ++lim[i];

            dfs(tmp,src,lim,len,i);

            src=t;
            tmp[--len]=-1;
            --lim[i];

        }
    }

}
int main(){
    readf;
    writef;
    int src=0;
    FF(i,9){
        int a;SD(a);
        a=(a/3)&3;
        src+=(a<<(8-i)*3);
    }
    dfs(tmp,src,lim,0,0);
    FF(i,min_len-1){
        PD(ans[i]+1);PS;
    }
    PD(ans[min_len-1]+1);LN;
    return 0;
}

 

抱歉!评论已关闭.