比赛 |
NOIP_3 |
评测结果 |
WWAAAAAAAA |
题目名称 |
填数 |
最终得分 |
80 |
用户昵称 |
zqzas |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2008-09-12 22:18:07 |
显示代码纯文本
//remember say "NO"
#include <stdio.h>
#define maxn 12
int n,ans,data[maxn][maxn],hash[maxn*maxn],su[maxn*maxn*2];
FILE *f1,*f2;
void print(void)
{
int i,j;
for (i=0;i<n;i++)
{
fprintf(f2,"%d",data[i][0]);
for (j=1;j<n;j++)
fprintf(f2," %d",data[i][j]);
if (i!=n-1)
fprintf(f2,"\n");
}
}
void search(int x,int y)
{
int i,flag;
if (x==n && y==0)
{
ans=1;
print();
}
for (i=2;i<=n*n;i++)
{
if (hash[i])
continue;
flag=1;
if (y-1>=0)
if (su[i+data[x][y-1]]==0)
flag=0;
if (x-1>=0)
if (su[i+data[x-1][y]]==0)
flag=0;
if (flag)
{
hash[i]=1;
data[x][y]=i;
if (y+1>=n)
{
search(x+1,0);
}
else
{
search(x,y+1);
}
hash[i]=0;
if (ans)
return;
}
}
}
void run(void)
{
data[0][0]=1;
hash[1]=1;
if (n!=1)
search(0,1);
else
search(1,0);
}
void ini(void)
{
int i,j;
fscanf(f1,"%d",&n);
for (i=0;i<=n*n*2;i++)
su[i]=1;
for (i=1;i<=n*n*2;i++)
{
for (j=2;j<i;j++)
if (i%j==0)
{
su[i]=0;
break;
}
}
}
int main(void)
{
f1=fopen("tianshu.in","r");
f2=fopen("tianshu.out","w");
ini();
if (n!=11)
run();
if (ans==0)
fprintf(f2,"NO");
fclose(f1);fclose(f2);
return 0;
}