求助,哪里还能优化
  • 板块UVA12988 Sudoku
  • 楼主Iwara
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/9 16:30
  • 上次更新2023/11/3 04:56:41
查看原帖
求助,哪里还能优化
252549
Iwara楼主2023/8/9 16:30

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,pos,len;
char mp[10][10];
ll ans,pre[100];
bool check(ll now){
	ll tmp[10][10];
	for(int i=1;i<=16;i++)tmp[(i-1)/4+1][(i-1)%4+1]=now/pre[16-i]%10;
	ll fl[10];
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++)fl[j]=0;
		for(int j=1;j<=4;j++)fl[tmp[i][j]]++;
		if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	}
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++)fl[j]=0;
		for(int j=1;j<=4;j++)fl[tmp[j][i]]++;
		if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	}
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[1][1]]++,fl[tmp[1][2]]++,fl[tmp[2][1]]++,fl[tmp[2][2]]++;
	if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[1][3]]++,fl[tmp[1][4]]++,fl[tmp[2][3]]++,fl[tmp[2][4]]++;
	if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[3][1]]++,fl[tmp[3][2]]++,fl[tmp[4][1]]++,fl[tmp[4][2]]++;
	if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[3][3]]++,fl[tmp[3][4]]++,fl[tmp[4][3]]++,fl[tmp[4][4]]++;
	if(!(fl[1]==1&&fl[2]==1&&fl[3]==1&&fl[4]==1))return 0;
	return 1;
}
bool nxt_check(ll now){
	ll tmp[10][10];
	for(int i=1;i<=16;i++)tmp[(i-1)/4+1][(i-1)%4+1]=now/pre[16-i]%10;
	ll fl[10];
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++)fl[j]=0;
		for(int j=1;j<=4;j++)fl[tmp[i][j]]++;
		if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	}
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++)fl[j]=0;
		for(int j=1;j<=4;j++)fl[tmp[j][i]]++;
		if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	}
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[1][1]]++,fl[tmp[1][2]]++,fl[tmp[2][1]]++,fl[tmp[2][2]]++;
	if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[1][3]]++,fl[tmp[1][4]]++,fl[tmp[2][3]]++,fl[tmp[2][4]]++;
	if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[3][1]]++,fl[tmp[3][2]]++,fl[tmp[4][1]]++,fl[tmp[4][2]]++;
	if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	fl[1]=fl[2]=fl[3]=fl[4]=0;
	fl[tmp[3][3]]++,fl[tmp[3][4]]++,fl[tmp[4][3]]++,fl[tmp[4][4]]++;
	if(!(fl[1]<=1&&fl[2]<=1&&fl[3]<=1&&fl[4]<=1))return 0;
	return 1;
}
void solve(ll now,ll L){
	if(ans)return;
	if(L==16){
		if(check(now))ans=now;
		return;
	}
	for(int i=1;i<=16;i++){
		if(now/pre[16-i]%10)continue;
		for(int j=1;j<=4;j++)if(nxt_check(now+j*pre[16-i]))solve(now+j*pre[16-i],L+1);
	}
	return;
}
ll fl_[10];
int main(){
	pre[0]=1;
	for(int i=1;i<=16;i++)pre[i]=(pre[i-1]<<1)+(pre[i-1]<<3);
	cin>>t;
	for(int qwq=1;qwq<=t;qwq++){
		for(int i=1;i<=4;i++)for(int j=1;j<=4;j++)cin>>mp[i][j];
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++)fl_[j]=0;
			for(int j=1;j<=4;j++){
				if(mp[i][j]=='*')continue;
				fl_[mp[i][j]-'0']++;
			}
			if(fl_[1]+fl_[2]+fl_[3]+fl_[4]==3){
				for(int j=1;j<=4;j++){
					if(mp[i][j]=='*'){
						for(int k=1;k<=4;k++)if(fl_[k]==0){
							mp[i][j]='0'+k;
							break;
						}
					}
				}
			}
		}
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++)fl_[j]=0;
			for(int j=1;j<=4;j++){
				if(mp[j][i]=='*')continue;
				fl_[mp[j][i]-'0']++;
			}
			if(fl_[1]+fl_[2]+fl_[3]+fl_[4]==3){
				for(int j=1;j<=4;j++){
					if(mp[j][i]=='*'){
						for(int k=1;k<=4;k++)if(fl_[k]==0){
							mp[j][i]='0'+k;
							break;
						}
					}
				}
			}
		}
		pos=0,len=0;
		for(int i=1;i<=16;i++)pos=pos*10*1ll+1ll*(mp[(i-1)/4+1][(i-1)%4+1]=='*'?0:mp[(i-1)/4+1][(i-1)%4+1]-'0'),len+=(mp[(i-1)/4+1][(i-1)%4+1]!='*');
		ans=0;
		solve(pos,len);
		cout<<"Case #"<<qwq<<":"<<endl<<ans/pre[12]<<endl<<ans/pre[8]%pre[4]<<endl<<ans/pre[4]%pre[4]<<endl<<ans%pre[4]<<endl;
	}
	return 0;
}
2023/8/9 16:30
加载中...