求助90ptsWA on #8 & 代码厌氧 码风清晰有注释不求调

P1312 [NOIP2011 提高组] Mayan 游戏

```cpp #include<bits/stdc++.h> //#pragma GCC optimize(2) #define LL long long using namespace std; const int N=10,n=5,m=7/*奇怪的习惯*/; int k,cnt,sum; struct pri{//存答案 int x,y,fx; }ans[N]; struct jvzhen{//矩阵结构体 int f[N][N];//注意我代码里第一维表示列,第二维表示行 jvzhen(){ memset(f,0,sizeof(f)); } }f; inline void read(int &x){//好习惯 x=0;int f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} x*=f; } #define cin(x) read(x) //void print(jvzhen f){ // for(int j=m;j>=1;j--){ // for(int i=1;i<=n;i++){ // cout<<f.f[i][j]<<' '; // } // cout<<endl; // } // cout<<endl; //} void fuzhi(jvzhen&f,jvzhen&g){//复制 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ f.f[i][j]=g.f[i][j]; } } } void xialuo(jvzhen&f){//下落 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(f.f[i][j]==0){//这个位置空 for(int k=j+1;k<=m;k++){ swap(f.f[i][k],f.f[i][k-1]);//上面每个都下落 } } } } } bool xiaochu(jvzhen&f){//消除能消除的 jvzhen g; while(true){ xialuo(f); fuzhi(g,f); bool flg=1; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){//看着这个消那个,保证全部消除 if(j+2<=m&&f.f[i][j]&&f.f[i][j]==f.f[i][j+1]&&f.f[i][j]==f.f[i][j+2]){//竖着消除 g.f[i][j]=g.f[i][j+1]=g.f[i][j+2]=0; flg=0; } if(i+2<=n&&f.f[i][j]&&f.f[i][j]==f.f[i+1][j]&&f.f[i][j]==f.f[i+2][j]){//横着消除 g.f[i][j]=g.f[i+1][j]=g.f[i+2][j]=0; flg=0; } } } if(flg) break;//没有能消除的了 xialuo(g); fuzhi(f,g); } } bool panduan(jvzhen f){//判断是否全空 for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(f.f[i][j]) return 0; } } return 1; } void shuchu(){//输出答案 for(int i=1;i<=k;i++){ printf("%d %d %d\n",ans[i].x-1,ans[i].y-1,ans[i].fx); } } bool shensou(int cnt/*步数*/,jvzhen f/*当前矩阵*/){//dfs xialuo(f); xiaochu(f); if(cnt==k+1){//边界,达到k步 if(panduan(f)){ shuchu(); return 1; } return 0; } for(int i=1;i<=n;i++){//枚举每个点移动 for(int j=1;j<=m;j++){ if(f.f[i][j]){//剪枝(划掉),空格显然不移动 if(i<n){//右移 swap(f.f[i][j],f.f[i+1][j]); ans[cnt]={i,j,1};//记录答案 if(shensou(cnt+1,f)){ swap(f.f[i][j],f.f[i+1][j]); return 1; } swap(f.f[i][j],f.f[i+1][j]); } if(i>1&&!f.f[i-1][j]){//左移&剪枝,如果是交换的话左右移动等价 swap(f.f[i][j],f.f[i-1][j]); ans[cnt]={i,j,-1};//记录答案 if(shensou(cnt+1,f)){ swap(f.f[i][j],f.f[i-1][j]); return 1; } swap(f.f[i][j],f.f[i-1][j]); } } } } return 0; } int main(){ cin(k); for(int i=1;i<=n;i++){//读入,可能有点奇怪 int j=0,col=0; while(true){ cin(col); if(col==0) break; f.f[i][++j]=col; } } if(!shensou(1,f)){//调用入口 puts("-1"); } return 0; } ```
by fangzichang @ 2022-10-21 15:52:31


厌氧:`bool xiaochu(jvzhen&f)` 没有 `return`
by yuhaocheng @ 2023-01-28 14:42:57


@[fangzichang](/user/678087) (考古)
by yuhaocheng @ 2023-01-28 14:50:28


@[yuhaocheng](/user/244309) 乐,早就发现了并且改好了但是懒得发了—— 关注给了。
by fangzichang @ 2023-01-28 16:53:57


@[yuhaocheng](/user/244309) [去年11月的记录,可以看到O2+90pts](https://www.luogu.com.cn/record/93615803)
by fangzichang @ 2023-01-28 16:55:06


|