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