社区讨论

爆0求调

P1074[NOIP 2009 提高组] 靶形数独参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo925oe4
此快照首次捕获于
2023/10/28 04:20
2 年前
此快照最后确认于
2023/10/28 04:20
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int a[15][15],h[15][15],v[15][15],l[15][15],kk[17][17];
long long ans;
int go[10][10]={0,0,0,0,0,0,0,0,0,0,
                0,1,1,1,2,2,2,3,3,3,
                0,1,1,1,2,2,2,3,3,3,               
            	0,1,1,1,2,2,2,3,3,3,
                0,4,4,4,5,5,5,6,6,6,
                0,4,4,4,5,5,5,6,6,6,
                0,4,4,4,5,5,5,6,6,6,
                0,7,7,7,8,8,8,9,9,9,
                0,7,7,7,8,8,8,9,9,9,
                0,7,7,7,8,8,8,9,9,9};
int fe[10][10]={0,0,0,0,0,0,0,0,0,0,
            	0,6,6,6,6,6,6,6,6,6,
                0,6,7,7,7,7,7,7,7,6,
                0,6,7,8,8,8,8,8,7,6,
                0,6,7,8,9,9,9,8,7,6,
                0,6,7,8,9,10,9,8,7,6,
                0,6,7,8,9,9,9,8,7,6,
                0,6,7,8,8,8,8,8,7,6,
                0,6,7,7,7,7,7,7,7,6,
                0,6,6,6,6,6,6,6,6,6};
void dfs(int x,int y,long long sum){
	if(a[x][y]!=0){
		dfs(x,y+1,sum);
	}
	//printf("   %d %d %d\n",x,y,sum);
	//system("pause");
	if(y==10){
	//	cout<<1<<endl;
		dfs(x+1,1,sum);
		return;
	}
	if(x==10){
	//	cout<<2<<endl;
		ans=max(ans,sum);
		return;
	}
	for(int i=1;i<=9;i++){
	//	cout<<"  "<<i<<" ";
		if(h[x][i]==0&&l[y][i]==0&&v[go[x][y]][i]==0&&a[x][y]==0){
	//		cout<<1;
			h[x][i]=1;
			l[y][i]=1;
			a[x][y]=i;
			v[go[x][y]][i]=1;
			dfs(x,y+1,sum+fe[x][y]*a[x][y]);
			a[x][y]=0;
			h[x][i]=0;
			l[y][i]=0;
			v[go[x][y]][i]=0;
		}
	//	cout<<endl;
	}
}
int main(){
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++){
			cin>>a[i][j];
			if(a[i][j]==0){
				continue;
			}
			h[i][a[i][j]]=1;
			l[j][a[i][j]]=1;
			v[go[i][j]][a[i][j]]=1;
		}
	}
	dfs(1,1,0);
	cout<<ans;
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...