2 条题解

  • 2
    @ 2021-8-7 21:07:53

    C++ :

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    bool h[9][9],l[9][9],q[10][9];
    int s[9][9];
    struct C{
    	int no;
    	int num;
    }c[9];
    int ans = 0;
    bool cmp(C a,C b){
    	return a.num < b.num; 
    }
    int count(int x, int y){
    	if(x==4&&y==4)
    		return 10;
    	else if(x>=3&&x<=5&&y>=3&&y<=5)
    		return 9;
    	else if(x>=2&&x<=6&&y>=2&&y<=6)
    		return 8;
    	else if(x>=1&&x<=7&&y>=1&&y<=7)
    		return 7;
    	else if(x>=0&&x<=8&&y>=0&&y<=8)
    		return 6;
    }
    int space(int x,int y) {
    	if(x>=0&&x<3&&y>=0&&y<3)
    		return 1;
    	if(x>=0&&x<3&&y>=3&&y<6)
    		return 2;
    	if(x>=0&&x<3&&y>=6&&y<9)
    		return 3;
    	if(x>=3&&x<6&&y>=0&&y<3)
    		return 4;
    	if(x>=3&&x<6&&y>=3&&y<6)
    		return 5;
    	if(x>=3&&x<6&&y>=6&&y<9)
    		return 6;
    	if(x>=6&&x<9&&y>=0&&y<3)
    		return 7;
    	if(x>=6&&x<9&&y>=3&&y<6)
    		return 8;
    	if(x>=6&&x<9&&y>=6&&y<9)
    		return 9;
    
    }
    int tot(){
    	int sum = 0;
    	for(int i=0;i<9;i++)
    		for(int j=0;j<9;j++){
    			sum += s[i][j]*count(i,j);
    		}
    	return sum ; 
    }
    void dfs(int x,int y) {
    	int xx = c[x].no;
    	if(s[xx][y]!=0) {
    		if(x==8&&y==8) {
    			int sum = tot();
    			if(sum>ans)
    				ans = sum;
    			return ;
    		}
    		if(y==8)
    			dfs(x+1,0);
    		else
    			dfs(x,y+1);
    	} else {
    		for(int i=1; i<=9; i++) {
    			if(!h[xx][i]&&!l[y][i]&&!q[space(xx,y)][i]) {
    				s[xx][y] = i;
    				h[xx][i] = 1;
    				l[y][i] = 1;
    				q[space(xx,y)][i] = 1;
    				dfs(x,y);
    				s[xx][y] = 0;
    				h[xx][i] = 0;
    				l[y][i] = 0;
    				q[space(xx,y)][i] = 0;
    			}
    
    		}
    	}
    
    
    }
    int main() {
    	int points = 0;
    	for(int i=0; i<9; i++)
    		for(int j=0; j<9; j++) {
    			cin>>s[i][j];
    			if(s[i][j]!=0) {
    				
    				h[i][s[i][j]] = 1;
    				l[j][s[i][j]] = 1;
    				q[space(i,j)][s[i][j]] = 1;
    			}
    			else{
    				c[i].num++ ;
    				c[i].no = i;
    			}
    		}
    	sort(c,c+9,cmp);
    	dfs(0,0);
    	if(ans)
    		cout<<ans<<endl;
    	else 
    		cout<<-1<<endl;
    	return 0;
    }
    
    • 0
      @ 2023-5-24 19:18:31
      建议使用该AC题解
      
      #include <bits/stdc++.h>
      using namespace std;
      int num,ans=-1,cur;
      int G[10][10],rec[512],power[512];
      int row[10],col[10],grid[10];
      const int grade[9][9]={
      {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}
      };
      int g(int x,int y) {
          return x/3*3+y/3;
      }
      void flip(int x,int y,int val) {
          row[x]^=1<<(val-1);
          col[y]^=1<<(val-1);
          grid[g(x,y)]^=1<<(val-1);
      }
      void dfs(int now,int sum) {
          if(sum+now*9*10<=ans) return;
          if(now==0) {
              ans=max(ans,sum);
              return;
          }
          int minn=10,x,y;
          for(int i=0;i<9;i++) {
              for(int j=0;j<9;j++) {
                  if(G[i][j]) continue;
                  int val=row[i]&col[j]&grid[g(i,j)];
                  if(rec[val]<minn) minn=rec[val],x=i,y=j;
              }
          }
          int val=row[x]&col[y]&grid[g(x,y)];
          for(;val;val-=val&-val) {
              int k=power[val&-val];
              G[x][y]=k;
              flip(x,y,k);
              dfs(now-1,sum+k*grade[x][y]);
              G[x][y]=0;
              flip(x,y,k);
          }
      }
      int main() {
          for(int i=1;i<1<<9;i++)
              for(int j=i;j;j-=j&-j)
                  rec[i]++;
          for(int i=0;i<9;i++) {
              row[i]=col[i]=grid[i]=(1<<9)-1;
              power[1<<i]=i+1;
          }
          for(int i=0;i<9;i++) {
              for(int j=0;j<9;j++) {
                  scanf("%d",&G[i][j]);
                  if(G[i][j]==0) num++;
                  else flip(i,j,G[i][j]),cur+=grade[i][j]*G[i][j];
              }
          }
          dfs(num,cur);
          printf("%d\n",ans);
          return 0;
      }
      
      • 1

      信息

      ID
      94
      时间
      1000ms
      内存
      128MiB
      难度
      7
      标签
      递交数
      118
      已通过
      31
      上传者