用 AC 代码进行提交,再开启 O2 优化,为什么却只有 90 分?
查看原帖
用 AC 代码进行提交,再开启 O2 优化,为什么却只有 90 分?
786834
Herman526楼主2023/4/29 16:48

解决该问题时,我曾用 dfs 写过一段 AC 代码。

#include<bits/stdc++.h>
int n,a[5][7],s[5][3],t[7],d;//a 为目前 dfs 后得到的界面,s 为答案,d 为搜索层数
bool b[5][7];//b[i][j] 用于记录 (i,j) 是否需要被消除
bool f(){//更新游戏界面
	bool y=0;//y=0 表示已通关
	for(int i=0;i<5;i++){
		int x=-1;
		for(int j=0;j<7;j++)
			if(b[i][j])a[i][j]=b[i][j]=0;
			else if(a[i][j])t[++x]=a[i][j];//t 用于自下而上记录该列的格子颜色
		memcpy(a[i],t,28);//重置该列(掉落悬空块)
		memset(t,0,x+1<<2);
		y|=~x;
	}
	bool z=0;//z 用于判断该游戏界面是否需要消除
	for(int i=0;i<3;i++)for(int j=0;j<7;j++)if(a[i][j]&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j])z=1,b[i][j]=b[i+1][j]=b[i+2][j]=1;
	for(int i=0;i<5;i++)for(int j=0;j<5;j++)if(a[i][j]&&a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2])z=1,b[i][j]=b[i][j+1]=b[i][j+2]=1;
	//记录消除格
	if(!y&&!d){
		while(n--)printf("%d %d %d\n",s[n][0],s[n][1],s[n][2]);
		exit(0);
	}
	return z;
}
void _(){
	for(int i=0;i<5;i++)for(int j=0;j<7;j++)if(a[i][j]){
		if(i^4&&a[i][j]^a[i+1][j]){
			int r[5][7];
			memcpy(r,a,140);
			std::swap(a[i][j],a[i+1][j]);
			s[d][0]=i,s[d][1]=j,s[d][2]=1;//记录操作
			bool z;
			do z=f();while(z);//在需要消除时不断消除
			if(d)d--,_(),d++;
			memcpy(a,r,140);
		}
		if(i&&!a[i-1][j]){
			int r[5][7];
			memcpy(r,a,140);
			std::swap(a[i][j],a[i-1][j]);
			s[d][0]=i,s[d][1]=j,s[d][2]=-1;
			bool z;
			do z=f();while(z);
			if(d)d--,_(),d++;
			memcpy(a,r,140);
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<5;i++)for(int j=0;;j++){
		scanf("%d",&a[i][j]);
		if(!a[i][j])break;
	}
	d=n-1;
	_();
	puts("-1");
}

在我提交这段代码时,我兴奋于这段代码的正确性如此之高。可就在我打开 O2 优化再一测时,测试点 #8 却没有输出正确答案。

我十分疑惑,便把这段代码复制到了洛谷 IDE 上,再下载了测试点 #8 一测——谁知,这段代码什么也没有输出,便毫无预告地结束了。

看到这里,我的疑问更多了:这段代码中,明明不管怎样都是要输出的(不是到 f 函数里输出答案,就是到主函数里输出 -1),却为什么会有可能什么也不输出? 大家能告诉我其中的道理吗?

2023/4/29 16:48
加载中...