首页 > 代码库 > [NOIP2009] 靶形数独
[NOIP2009] 靶形数独
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<iostream> 5 #define sh short 6 #define mem(a,b) memset(a,b,sizeof(a)) 7 using namespace std; 8 inline int maxn(int a,int b){return a>b?a:b;} 9 10 /*struct son 11 { 12 int x,y; 13 son(int qq=0,int ww=0) 14 { 15 x=qq;y=ww; 16 } 17 }; 18 son ji[206];*/ 19 //int num; 20 int a[11][11]; 21 bool heng[11][11],zong[11][11]; 22 int dui[11][11]; 23 int pos[11][11],judge[11][11]; 24 25 int ans,sco; 26 27 void dfs(sh x,sh y) 28 { 29 if(y==10) 30 y=1,++x; 31 if(x==10) 32 { 33 ans=maxn(ans,sco); 34 return ; 35 } 36 if(a[x][y]) 37 { 38 dfs(x,y+1); 39 return ; 40 } 41 42 for(sh i=9;i>=1;--i) 43 { 44 if(heng[x][i]||zong[y][i]||judge[pos[x][y]][i])continue; 45 heng[x][i]=1; 46 zong[y][i]=1; 47 judge[pos[x][y]][i]=1; 48 //a[x][y]=i; 49 50 sco+=i*dui[x][y]; 51 dfs(x,y+1); 52 heng[x][i]=0; 53 zong[y][i]=0; 54 judge[pos[x][y]][i]=0; 55 //a[x][y]=0; 56 sco-=i*dui[x][y]; 57 } 58 } 59 60 int main(){ 61 //freopen("1.txt","r",stdin); 62 //freopen("2.txt","w",stdout); 63 //freopen("sudoku.in","r",stdin); 64 //freopen("sudoku.out","w",stdout); 65 for(int i=1;i<=9;++i) 66 for(int j=1;j<=9;++j) 67 { 68 scanf("%d",&a[i][j]); 69 /*if(!a[i][j])continue; 70 if(heng[i][a[i][j]]||zong[j][a[i][j]]) 71 { 72 printf("-1"); 73 return 0; 74 }*/ 75 heng[i][a[i][j]]=1; 76 zong[j][a[i][j]]=1; 77 } 78 79 for(int j=1;j<=9;++j) 80 dui[1][j]=dui[9][j]=6; 81 for(int i=2;i<=8;++i) 82 dui[i][1]=dui[i][9]=6; 83 for(int j=2;j<=8;++j) 84 dui[2][j]=dui[8][j]=7; 85 for(int i=3;i<=7;++i) 86 dui[i][2]=dui[i][8]=7; 87 for(int j=3;j<=7;++j) 88 dui[3][j]=dui[7][j]=8; 89 for(int i=4;i<=6;++i) 90 dui[i][3]=dui[i][7]=8; 91 for(int j=4;j<=6;++j) 92 dui[4][j]=dui[6][j]=9; 93 for(int i=5;i<=5;++i) 94 dui[i][4]=dui[i][6]=9; 95 dui[5][5]=10; 96 97 for(int i=1;i<=9;++i) 98 for(int j=1;j<=9;++j) 99 sco+=dui[i][j]*a[i][j]; 100 101 /*for(int i=1;i<=9;++i) 102 for(int j=1;j<=9;++j) 103 if(dui[i][j]==10&&a[i][j]==0) 104 ji[++num]=son(i,j); 105 for(int i=1;i<=9;++i) 106 for(int j=1;j<=9;++j) 107 if(dui[i][j]==9&&a[i][j]==0) 108 ji[++num]=son(i,j); 109 for(int i=1;i<=9;++i) 110 for(int j=1;j<=9;++j) 111 if(dui[i][j]==8&&a[i][j]==0) 112 ji[++num]=son(i,j); 113 for(int i=1;i<=9;++i) 114 for(int j=1;j<=9;++j) 115 if(dui[i][j]==7&&a[i][j]==0) 116 ji[++num]=son(i,j); 117 for(int i=1;i<=9;++i) 118 for(int j=1;j<=9;++j) 119 if(dui[i][j]==6&&a[i][j]==0) 120 ji[++num]=son(i,j);*/ 121 /*printf("\n"); 122 for(int i=1;i<=9;++i) 123 { 124 for(int j=1;j<=9;++j) 125 printf("%d ",dui[i][j]); 126 printf("\n"); 127 } 128 printf("\n"); 129 130 printf("sco=%d\n",sco);*/ 131 132 for(int i=1;i<=3;++i) 133 for(int j=1;j<=3;++j) 134 pos[i][j]=1; 135 for(int i=1;i<=3;++i) 136 for(int j=4;j<=6;++j) 137 pos[i][j]=2; 138 for(int i=1;i<=3;++i) 139 for(int j=7;j<=9;++j) 140 pos[i][j]=3; 141 for(int i=4;i<=6;++i) 142 for(int j=1;j<=3;++j) 143 pos[i][j]=4; 144 for(int i=4;i<=6;++i) 145 for(int j=4;j<=6;++j) 146 pos[i][j]=5; 147 for(int i=4;i<=6;++i) 148 for(int j=7;j<=9;++j) 149 pos[i][j]=6; 150 for(int i=7;i<=9;++i) 151 for(int j=1;j<=3;++j) 152 pos[i][j]=7; 153 for(int i=7;i<=9;++i) 154 for(int j=4;j<=6;++j) 155 pos[i][j]=8; 156 for(int i=7;i<=9;++i) 157 for(int j=7;j<=9;++j) 158 pos[i][j]=9; 159 160 for(int i=1;i<=9;++i) 161 for(int j=1;j<=9;++j) 162 judge[pos[i][j]][a[i][j]]=1; 163 164 ans=-1; 165 dfs(1,1); 166 167 cout<<ans; 168 169 while(1); 170 return 0; 171 }
[NOIP2009] 靶形数独
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。