O2优化 WA#8 90分

P1312 [NOIP2011 提高组] Mayan 游戏

悬赏关注QWQ 谢谢
by 137QWQ @ 2022-08-03 17:23:09


@[137QWQ](/user/167875) ### 这是我的代码,可以参考一下: ``` #include<bits/stdc++.h> using namespace std; int n,a[8][6],flag,F,d,da[40],db[40],dc[40],ans[8][3],S[12],T; void cheak() { d = false; bool f[8][6]; memset(f,false,sizeof(f)); for (int i = 1; i <= 5; i++) for (int j = 1; j <= 7; j++) if (a[j][i]) { if (i <= 3 && a[j][i] == a[j][i + 1] && a[j][i+1] == a[j][i + 2]) f[j][i] = f[j][i + 1] = f[j][i + 2] = true; if (j <= 5 && a[j][i] == a[j + 1][i] && a[j+1][i] == a[j + 2][i]) f[j][i] = f[j + 1][i] = f[j + 2][i] = true; } for (int i = 1; i <= 5; i++) for (int j = 1; j <= 7; j++) if (f[j][i]) { a[j][i] = 0; --a[0][i]; d = true; } } void CD() { cheak(); while(d) { for (int i = 1; i <= 5; i++) { int s = 0; for (int j = 1; j <= 7; j++) { int t = a[j][i]; a[j][i] = 0; if(t) ++s,a[s][i] = t; } } cheak(); } } bool jz() { for(int i = 1; i <= T; i++) S[i]=0; for(int i = 1; i <= 5; i++) for(int j = 1; j <= a[0][i]; j++) S[a[j][i]]++; for(int i = 1; i <= T; i++) if(S[i]==1|S[i]==2) return 1; return 0; } void dfs(int x) { if(flag) return; if(x==n) { F=0; for(int i = 1; i <= 5; i++) { if(a[0][i]!=0) { F=1; break; } } if(!F) { for(int i = 1; i <= n; i++) { printf("%d %d %d\n",ans[i][0],ans[i][1],ans[i][2]); } flag=1; } return; } if(jz()) return; int save[8][6]; for(int i = 1; i <= 5; i++) { save[0][i]=a[0][i]; for(int j = 1; j <= a[0][i]; j++) save[j][i]=a[j][i]; } for(int i = 1; i <= 5; i++) { for(int j = 1; j <= a[0][i]; j++) { if(i!=5) { if(a[j][i+1]) swap(a[j][i+1],a[j][i]); else { ++a[0][i+1],a[a[0][i+1]][i+1]=a[j][i]; for(int k = j+1; k <= a[0][i]; k++) a[k-1][i]=a[k][i]; a[a[0][i]][i]=0,--a[0][i]; } CD(); ans[x+1][0]=i-1,ans[x+1][1]=j-1,ans[x+1][2]=1; dfs(x+1); for(int i = 1; i <= 5; i++) { a[0][i]=save[0][i]; for(int j = 1; j <= save[0][i]; j++) { a[j][i]=save[j][i]; } for(int j = save[0][i]+1; j <= 7; j++) { a[j][i]=0; } } } if(i!=1&&a[j][i-1]==0) { ++a[0][i-1],a[a[0][i-1]][i-1]=a[j][i]; for(int k = j+1; k <= a[0][i]; k++) a[k-1][i]=a[k][i]; a[a[0][i]][i]=0,--a[0][i]; CD(); ans[x+1][0]=i-1,ans[x+1][1]=j-1,ans[x+1][2]=-1; dfs(x+1); for(int i = 1; i <= 5; i++) { a[0][i]=save[0][i]; for(int j = 1; j <= save[0][i]; j++) { a[j][i]=save[j][i]; } for(int j = save[0][i]+1; j <= 7; j++) { a[j][i]=0; } } } } } } int main() { scanf("%d",&n); for(int i = 1; i <= 5; i++) { for(int j = 1; j <= 8; j++) { scanf("%d",&a[j][i]); T=max(T,a[j][i]); if(a[j][i]==0) { a[0][i]=j-1; break; } } } dfs(0); if(!flag) printf("-1"); return 0; } ```
by 2012GFKKKZ @ 2023-08-11 12:50:15


@[fendigao](/user/1037866) qwq 太强了
by 137QWQ @ 2023-08-12 14:26:30


|