记录编号 |
174052 |
评测结果 |
AAAAAAAAAAAAAAAAAATA |
题目名称 |
[NOIP 2009]靶形数独 |
最终得分 |
95 |
用户昵称 |
devil |
是否通过 |
未通过 |
代码语言 |
C++ |
运行时间 |
2.527 s |
提交时间 |
2015-07-31 10:09:31 |
内存使用 |
0.32 MiB |
显示代码纯文本
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
#include <map>
#include <ctime>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
const int maxn=2000010;
const int maxm=90010;
const int MAX_INT=0x7fffffff;
const int max_int=1061109567;
const int mod=12345;
int sorce[15][15]={
{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 num[15][15];int ans=0;
bool vis_x[15][10],vis_y[15][10],vis_e[10][10];
void check_point()
{
int s=0;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
s+=num[i][j]*sorce[i][j];
}
if(s>ans) ans=s;
}
void dfs(int x,int y)
{
if(y==-1) {x--;y=8;}
if(x==-1) {check_point();return;}
if(num[x][y]!=0) dfs(x,y-1);
else
{
int t=x/3*3+y/3;
for(int i=1;i<=9;i++)
{
if(!vis_x[x][i]&&!vis_y[y][i]&&!vis_e[t][i])
{
vis_x[x][i]=vis_y[y][i]=vis_e[t][i]=true;
num[x][y]=i;
dfs(x,y-1);
vis_x[x][i]=vis_y[y][i]=vis_e[t][i]=false;
num[x][y]=0;
}
}
}
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
clock_t st=clock();
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
scanf("%d",&num[i][j]);
vis_x[i][num[i][j]]=true;
vis_y[j][num[i][j]]=true;
vis_e[i/3*3+j/3][num[i][j]]=true;
}
}
dfs(8,8);
if(ans==0) printf("-1\n");
else printf("%d\n",ans);
clock_t et=clock();
//printf("\nTime used : %.4lf Ms\n",double(et-st)/CLOCKS_PER_SEC);
return 0;
}