poj 3849 Settlers of Catan 模拟
来源:互联网 发布:超越社交网络 paypal 编辑:程序博客网 时间:2024/05/21 22:53
#include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <map> #include <vector> #include <cmath> using namespace std; int in[7]; int C[78]; int d[10009]; void init() { C[0]=1; for(int i=1;i<70;i++) C[i]=6+6*(i-1); for(int i=1;i<70;i++) C[i]+=C[i-1];//C[i]前i个环的点的数目 for(int i=1;i<=5;i++) { d[i]=i; in[i]=1; } in[6]=1<<25; d[6]=2,d[7]=3; in[2]++,in[3]++; int c=2,num=1; //c表示目前在第几层,num表示在目前层已经生成了几个节点了。 int pre,L,R; L=7,R=2; //和i相邻的上一层的两个点的指针 for(int i=8;i<=10000;i++) { if(num==1) //本环中的第一个 { int min=6; for(int j=1;j<=5;j++) if(in[j]<in[min]&&j!=d[C[c-1]]&&j!=d[C[c-2]+1]) { min=j; } d[i]=min; in[min]++; num++; pre=i; L=R; R=L+1; } else if(num%c!=0) //本环中不在转折点上的点 { int min=6; for(int j=1;j<=5;j++) if(in[j]<in[min]&&j!=d[L]&&j!=d[R]&&j!=d[pre]) { min=j; } d[i]=min; in[min]++; num++; L++; R++; pre=i; } else if(i==C[c]) //本环的结束点 { int min=6; for(int j=1;j<=5;j++) if(j!=d[L]&&j!=d[pre]&&in[j]<in[min]&&j!=d[C[c-1]+1]) { min=j; } d[i]=min; in[min]++; pre=i; num=1; L=i; c++; } else //本环的转折点 { int min=6; for(int j=1;j<=5;j++) if(j!=d[L]&&j!=d[pre]&&in[j]<in[min]) min=j; d[i]=min; in[min]++; num++; pre=i; if(i>=C[c]) { num=1; L=i; c++; } } } } int main() { int n,ca; init(); scanf("%d",&ca); while(ca--) { scanf("%d",&n); printf("%d\n",d[n]); } return 0; }