2 条题解
-
0
一个剪枝加小特判ac代码:
#include<bits/stdc++.h> using namespace std; bool area[10][10],line[10][10],lie1[10][10];//判断是否重复 char a1[10][10]; int a[10][10],f[10][10],sum1,sum2[100001]; int v[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}}; struct start{ int num,sum0; }st[10]; void init() { int l=0,lie=0; for(int i=1;i<=9;i++) { l++; lie=0; st[i].num=i; for(int j=1;j<=9;j++) { cin>>a1[i][j]; lie++; a[i][j]=a1[i][j]-'0'; if(a[i][j]!=0) { st[i].sum0++; f[i][j]=a[i][j]; line[l][a[i][j]]=true; lie1[lie][a[i][j]]=true; if(l<=3) { if(lie<=3) area[1][a[i][j]]=true; if(lie>3&&lie<=6) area[2][a[i][j]]=true; if(lie>6&&lie<=9) area[3][a[i][j]]=true; } if(l>3&&l<=6) { if(lie<=3) area[4][a[i][j]]=true; if(lie>3&&lie<=6) area[5][a[i][j]]=true; if(lie>6&&lie<=9) area[6][a[i][j]]=true; } if(l>6&&l<=9) { if(lie<=3) area[7][a[i][j]]=true; if(lie>3&&lie<=6) area[8][a[i][j]]=true; if(lie>6&&lie<=9) area[9][a[i][j]]=true; } } } } } int cmp(start a, start b) { return a.sum0>b.sum0; } void printf() { sum1++; for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { sum2[sum1]+=f[i][j]*v[i][j]; } } } void search(int x,int y,int z) { int area1; if(a[x][y]!=0) { if(z==9&&y==9) printf(); if(y!=9) search(x,y+1,z); if(y==9) search(st[++z].num,1,z); } if(a[x][y]==0) { if(x<=3) { if(y<=3) area1=1; if(y>3&&y<=6) area1=2; if(y>6&&y<=9) area1=3; } if(x>3&&x<=6) { if(y<=3) area1=4; if(y>3&&y<=6) area1=5; if(y>6&&y<=9) area1=6; } if(x>6&&x<=9) { if(y<=3) area1=7; if(y>3&&y<=6) area1=8; if(y>6&&y<=9) area1=9; } for(int i=1;i<=9;i++) { if(!line[x][i]&&!lie1[y][i]&&!area[area1][i]) { f[x][y]=i; line[x][i]=true; lie1[y][i]=true; area[area1][i]=true; if(z==9&&y==9) printf(); if(y==9) search(st[++z].num,1,z); else search(x,y+1,z); f[x][y]=0; line[x][i]=false; lie1[y][i]=false; area[area1][i]=false; } } } } int main() { init(); sort(st+1,st+10,cmp); search(st[1].num,1,1); int max1=0; for(int i=1;i<=sum1;i++) { max1=max(max1,sum2[i]); } if(max1==0) { cout<<"-1"; return 0; } cout<<max1; return 0; }
-
0
暴力算法75pts
#include<bits/stdc++.h> using namespace std; bool area[10][10],line[10][10],lie1[10][10];//判断是否重复 char a1[10][10]; int a[10][10],f[10][10],sum2[100001],sum1; int s[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 init() { int l=0,lie=0; for(int i=1;i<=9;i++) { l++; lie=0; for(int j=1;j<=9;j++) { cin>>a1[i][j]; lie++; a[i][j]=a1[i][j]-'0'; if(a[i][j]!=0) { f[i][j]=a[i][j]; line[l][a[i][j]]=true; lie1[lie][a[i][j]]=true; if(l<=3) { if(lie<=3) area[1][a[i][j]]=true; if(lie>3&&lie<=6) area[2][a[i][j]]=true; if(lie>6&&lie<=9) area[3][a[i][j]]=true; } if(l>3&&l<=6) { if(lie<=3) area[4][a[i][j]]=true; if(lie>3&&lie<=6) area[5][a[i][j]]=true; if(lie>6&&lie<=9) area[6][a[i][j]]=true; } if(l>6&&l<=9) { if(lie<=3) area[7][a[i][j]]=true; if(lie>3&&lie<=6) area[8][a[i][j]]=true; if(lie>6&&lie<=9) area[9][a[i][j]]=true; } } } } } void printf() { sum1++; for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { sum2[sum1]+=f[i][j]*s[i][j]; } } } void search(int x,int y) { int area1; if(a[x][y]!=0) { if(x==9&&y==9) printf(); if(y!=9) search(x,y+1); if(y==9) search(x+1,1); } if(a[x][y]==0) { if(x<=3) { if(y<=3) area1=1; if(y>3&&y<=6) area1=2; if(y>6&&y<=9) area1=3; } if(x>3&&x<=6) { if(y<=3) area1=4; if(y>3&&y<=6) area1=5; if(y>6&&y<=9) area1=6; } if(x>6&&x<=9) { if(y<=3) area1=7; if(y>3&&y<=6) area1=8; if(y>6&&y<=9) area1=9; } for(int i=1;i<=9;i++) { if(!line[x][i]&&!lie1[y][i]&&!area[area1][i]) { f[x][y]=i; line[x][i]=true; lie1[y][i]=true; area[area1][i]=true; if(x==9&&y==9) printf(); if(y==9) search(x+1,1); else search(x,y+1); f[x][y]=0; line[x][i]=false; lie1[y][i]=false; area[area1][i]=false; } } } } int main() { init(); search(1,1); int max1=0; for(int i=1;i<=sum1;i++) { max1=max(sum2[i],max1); } cout<<max1; return 0; }
- 1
信息
- ID
- 178
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 27
- 已通过
- 6
- 上传者