TLE85pts,开O2也只有95pts,求助
查看原帖
TLE85pts,开O2也只有95pts,求助
784856
Comars楼主2023/1/23 16:19

rt.代码如下

#include<cstdio>
#include<algorithm>
using namespace std;
int map[10][10],ans=-1,tot,begin_gets,row[10],col[10],squ[10],vec[10][10][10],tot_[10][10];
struct node{int x,y,pos;}a[90];
int score[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}};
inline int read(){
	char c=getchar();int f=0,s=1;
	while(c<'0'||c>'9'){if(c=='-') s=-1;c=getchar();}
	while(c>='0'&&c<='9'){f=f*10+c-48;c=getchar();}
	return f*s;
}
inline void print(int x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);
    putchar(x%10+'0');
}
inline int getsqu(int x,int y){return (x-1)/3*3+(y-1)/3+1;}
inline bool cmp(node a,node b){return a.pos<b.pos;}
inline void dfs(int x,int y,int gets,int step){
	if(step>tot){
		if(gets>ans) ans=gets;
		return;
	}
	for(int i=1;i<=tot_[x][y];i++){
        int k=vec[x][y][i];
		if(((row[x])&(1<<k))||((col[y])&(1<<k))||((squ[getsqu(x,y)])&(1<<k))) continue;
		map[x][y]=k;
		row[x]+=(1<<k),col[y]+=(1<<k),squ[getsqu(x,y)]+=(1<<k);
		dfs(a[step+1].x,a[step+1].y,gets+map[x][y]*score[x][y],step+1);
		row[x]-=(1<<k),col[y]-=(1<<k),squ[getsqu(x,y)]-=(1<<k);
		map[x][y]=0;
	}
}
int main(){
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++){
			map[i][j]=read();
			if(map[i][j]==0) continue;
            int k=(1<<map[i][j]);
			row[i]+=k,col[j]+=k,squ[getsqu(i,j)]+=k;
		}
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++){
			if(map[i][j]==0){
				a[++tot]={i,j,0};
				for(int k=1;k<=9;k++)
					if(row[i]&(1<<k)||col[j]&(1<<k)||squ[getsqu(i,j)]&(1<<k)) continue;
                    else a[tot].pos++,vec[i][j][++tot_[i][j]]=k;
			}else begin_gets+=map[i][j]*score[i][j];
		}
	sort(a+1,a+tot+1,cmp);
	dfs(a[1].x,a[1].y,begin_gets,1);
	print(ans);
	return 0;
}
2023/1/23 16:19
加载中...