社区讨论

80分TLE求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mizwcpy4
此快照首次捕获于
2025/12/10 18:59
3 个月前
此快照最后确认于
2025/12/13 09:35
3 个月前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int n=9,a[N][N],ans=-1,now;
int score[N][N]=
{
{6,6,6,6,6,6,6,6,6},
{6,7,7,7,7,7,7,7,6},
{6,7,8,8,8,8,8,7,6},
{6,7,8,9,9,9,8,7,6},
{6,7,8,9,10,9,8,7,6},
{6,7,8,9,9,9,8,7,6},
{6,7,8,8,8,8,8,7,6},
{6,7,7,7,7,7,7,7,6},
{6,6,6,6,6,6,6,6,6}
};
bool h[N][N],l[N][N],g[N][N],flag;
void dfs(int x,int y)
{
	if(a[x][y]!=0)
	{
		if(x==8 and y==8)
		{
			now=0;
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<n;j++)
				{
					now+=a[i][j]*score[i][j];
				}
			}
			if(now>ans) ans=now;
			return ;
//			exit(0);
		}
		if(y>=8) dfs(x+1,0);
		else dfs(x,y+1);
	}
	else
	{
		for(int i=1;i<=9;i++)
		{
			if(h[x][i]==0 and l[y][i]==0 and g[x/3*3+y/3][i]==0)
			{
				h[x][i]=l[y][i]=g[x/3*3+y/3][i]=1;
				a[x][y]=i;
				if(x==8 and y==8)
				{
					now=0;
        			for(int i=0;i<n;i++)
        			{
        				for(int j=0;j<n;j++)
        				{
        					now+=a[i][j]*score[i][j];
        				}
        			}
        			if(now>ans) ans=now;
//        			return ;
				}
				if(y>=8) dfs(x+1,0);
				else dfs(x,y+1);
				a[x][y]=0;
				h[x][i]=l[y][i]=g[x/3*3+y/3][i]=0;
			}
		}
	}
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			int x;
			cin>>x;
			a[i][j]=x;
			if(x)
			{
				h[i][x]=l[j][x]=g[i/3*3+j/3][x]=1;
			}
		}
	}
	dfs(0,0);
	cout<<ans<<'\n';
	
	
	return 0;
}
救救孩子!

回复

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

正在加载回复...