5 pts 求调
查看原帖
5 pts 求调
1296826
lcfollower楼主2024/7/17 20:16

rt,5 pts 改不出来大佬求调,谢谢。

#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}

const int N = 12;
const 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}
};
bool row[N][10] ,col[N][10] ,area[N][10];
int a[N][N] ,row_sum[N] ,col_sum[N] ,cnt ,ans = -1;

inline int get(int x,int y){return (x-1)/3*3+1+(y-1)/3;}
inline int judge(){
  int res = 0;
  up(i,1,9) up(j,1,9) res += a[i][j] * score[i][j];
  return res;
}inline void dfs(int r ,int c ,int num){
//writeln(num);
  if(num == 81){
 // puts("hi");
    ans = max(ans ,judge());
    return;
  }
  up(j,1,9){
    if(row[r][j] || col[c][j] || area[get(r,c)][j]) continue;
   // writesp(j);
    row[r][j] = col[c][j] = area[get(r,c)][j] = 1;
    row_sum[r] ++ ,col_sum[c] ++;
    a[r][c] = j;
    int nr = 0 ,nc = 0 ,r_num = 0, c_num = 0;
    up(i,1,9) if(row_sum[i] > nr && row_sum[i] != 9) nr = row_sum[i] ,r_num = i;
    up(i,1,9) if(col_sum[i] > nc && col_sum[i] != 9) nc = col_sum[i] ,c_num = i;
    dfs(r_num ,c_num ,num + 1);
    row[r][j] = col[c][j] = area[get(r,c)][j] = 0;
    row_sum[r] -- , col_sum[c] --;
    a[r][c] = 0;
  }
  //puts("");
} signed main(){
  up(i,1,9) up(j,1,9){
    a[i][j] = read();
    if(a[i][j]){
      row[i][a[i][j]] = col[j][a[i][j]] = area[get(i,j)][a[i][j]] = 1;
      row_sum[i] ++ , col_sum[j] ++ , cnt ++;
    }
  }
  int r = 0 ,c = 0 ,r_num = 0, c_num = 0;
  up(i,1,9) if(row_sum[i] > r && row_sum[i] != 9) r = row_sum[i] ,r_num = i;
  up(i,1,9) if(col_sum[i] > c && col_sum[i] != 9) c = col_sum[i] ,c_num = i;
  dfs(r_num ,c_num ,cnt);
  writeln(ans);
}
2024/7/17 20:16
加载中...