目录
1棋盘式(基于连通性)
1 蒙德里安的梦想
2 国王(井字形)
3 玉米田(十字形)
4 炮兵阵地(十字形2)
2 集合式
1 愤怒的小鸟
1棋盘式(基于连通性)
1 蒙德里安的梦想
291. 蒙德里安的梦想 - AcWing题库
#includeusing namespace std; const int N=12,M=1<<11; vector head;//用来记录第i层状态 vector state[M];//用来记录第i层状态下的满足条件的i-1层的状态 bool st[M];//用来标记有没有连续个偶数0 long long f[N][M]; int n,m; bool check(int state)//用来处理一个数有没有偶数个0 { int cnt=0; for(int i=0;i >i&1) { if(cnt&1) return false; cnt=0; } else cnt++; if(cnt&1) return false; return true; } int main() { while(cin>>n>>m,n||m) { memset(f,0,sizeof f);//刷新下一层状态 head.resize(0);//刷新下一层状态 for(int i=0;i<1<
2 国王(井字形)
信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
#includeusing namespace std; typedef long long ll; const int N=12,M=1<<10,K=110; vector state;//用来记录没有连续个1的数的合法状态 int cnt[M];//用来记录i这个数的国王数量 ll f[N][K][M]; vector head[M];//记录第i行的合法转移方案 int n,m; bool check(int state)//用来判断有没有连续个1 { for(int i=0;i >i&1)&&(state>>i+1&1)) return false; return true; } int count(int state)//用来求1的数量,也就是国王的数量 { int res=0; for(int i=0;i >i&1) res++; return res; } int main() { cin>>n>>m; for(int i=0;i<1< 3 玉米田(十字形)
327. 玉米田 - AcWing题库
#includeusing namespace std; const int N=14,M=1<<12,mod=1e8; vector state;//用来记录没有连续个1的数的合法状态 vector head[M];//记录第i行的合法转移方案 int f[N][M]; int g[N];//用来存每一行的不肥沃的地,也就是让不肥沃为1 int n,m; bool check(int state)//用来判断有没有连续个1 { for(int i=0;i >i&1)&&(state>>i+1&1)) return false; return true; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=0;j >a; if(!a) g[i]+=1< 4 炮兵阵地(十字形2)
信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
#includeusing namespace std; const int N=110,M=1<<10; vector state;//用来记录三个连续位置的数中最多只有一个1的数的合法状态 int f[2][M][M]; int g[N];//用来存每一行的山地,也就是让山地为1 int cnt[M];//用来存合法数中1的个数 int n,m; bool check(int state)//用来判断三个连续位置的数中最多只有一个1的数的合法状态 { for(int i=0;i >i&1)&&((state>>i+1&1)||(state>>i+2&1))) return false; return true; } int count(int state)//用来算一个数中1的个数 { int res=0; for(int i=0;i >i&1) res++; return res; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=0;j >a; if(a=='H') g[i]+=1< 2 集合式
1 愤怒的小鸟
信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)
#includeusing namespace std; #define x first #define y second #define db double const int N=20,M=1<<18; const db eps=1e-6; typedef pair pdd; int f[M]; pdd q[N]; int n,m; int path[N][N];/ bool cmp(db x,db y)//因为浮点数会失精度,用来判断两个数是否相等 { if(fabs(x-y) >T; while(T--) { cin>>n>>m; for(int i=0;i >q[i].x>>q[i].y; memset(path,0,sizeof path);//清空上一维的状态 for(int i=0;i 0||cmp(a,0.0)) continue;//开口向下,所以a<0 for(int k=0;k >j&1)) { x=j; break; } for(int j=0;j



