http://blog.sina.com.cn/s/blog_51cea4040100gxn1.html 下面内容是此链接的作者发给我的,可能是ccy自己写的也可能是她的朋友写的。
QQ及邮箱:1 4 2 3 1 7 3 7 8 3 @qq.com 欢迎吹毛求疵。
#include <iostream>
#include<time.h>
using namespace std;
#define NN 3
#define N (NN*NN)
#define MAXN (N*N*N+1)
#define MAXM ((N*N)*4+1)
struct type
{
int l,r,u,d,x,y;
} po[MAXN*MAXM];
int a[MAXN][MAXM],n,m,tot,c[MAXM],all;
int pn[MAXN][2],pm[MAXM][2],ans;
int sc[N*N];
int map[9][9]={
8,0,0,0,0,0,0,0,0,
0,0,3,6,0,0,0,0,0,
0,7,0,0,9,0,2,0,0,
0,5,0,0,0,7,0,0,0,
0,0,0,0,4,5,7,0,0,
0,0,0,1,0,0,0,3,0,
0,0,1,0,0,0,0,6,8,
0,0,8,5,0,0,0,1,0,
0,9,0,0,0,0,4,0,0};
void get(int x,int y,int z)
{
int o=x*N*N+y*N+z,w=x/NN*NN+y/NN;
a[o][x*N+z]=1;
a[o][N*N+y*N+z]=1;
a[o][N*N*2+w*N+z]=1;
a[o][N*N*3+x*N+y+1]=1;
}
void make(int x,int y)
{
po[tot].x=x;
po[tot].y=y;
c[y]++;
if (pn[x][0]<0)
pn[x][0]=tot;
else
{
po[tot].l=pn[x][1];
po[pn[x][1]].r=tot;
}
pn[x][1]=tot;
po[pn[x][0]].l=tot;
po[tot].r=pn[x][0];
if (pm[y][0]<0)
pm[y][0]=tot;
else
{
po[tot].u=pm[y][1];
po[pm[y][1]].d=tot;
}
pm[y][1]=tot;
po[pm[y][0]].u=tot;
po[tot].d=pm[y][0];
tot++;
}
int score(int w)
{
int x=w/9,y=w%9;
if (x==0||x==8||y==0||y==8)
return 6;
if (x==1||x==7||y==1||y==7)
return 7;
if (x==2||x==6||y==2||y==6)
return 8;
if (x==4&&y==4)
return 10;
return 9;
}
void pre()
{
int i,j,k,x;
memset(po,-1,sizeof(po));
memset(pn,-1,sizeof(pn));
memset(pm,-1,sizeof(pm));
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
n=MAXN-1;
m=MAXM-1;
all=0;
for (i=0;i<N*N;i++)
{
sc[i]=score(i);
all+=sc[i]*10;
}
ans=all;
for (i=0;i<=m;i++)
a[0][i]=1;
for (i=0;i<N;i++)
for (j=0;j<N;j++)
{
//scanf("%d",&x);
if (map[i][j]==0)
for (k=1;k<=N;k++)
get(i,j,k);
else
get(i,j,map[i][j]);
}
tot=0;
for (i=0;i<=n;i++)
for (j=0;j<=m;j++)
if (a[i][j])
make(i,j);
for(int i=0;i<=m;i++)
c[i]--;
}
void remove(int k)
{
int i,j;
po[po[k].l].r=po[k].r;
po[po[k].r].l=po[k].l;
for (i=po[k].d;i!=k;i=po[i].d)
for (j=po[i].r;j!=i;j=po[j].r)
{
po[po[j].u].d=po[j].d;
po[po[j].d].u=po[j].u;
c[po[j].y]--;
}
}
void resume(int k)
{
int i,j;
for (i=po[k].u;i!=k;i=po[i].u)
for (j=po[i].l;j!=i;j=po[j].l)
{
c[po[j].y]++;
po[po[j].u].d=j;
po[po[j].d].u=j;
}
po[po[k].l].r=k;
po[po[k].r].l=k;
}
bool dfs(int now)
{
int x=n+2,o,i,j,z;
if (po[0].r==0)
{
ans=now;
return(true);
}
for (i=po[0].r;i!=0;i=po[i].r)
if (c[po[i].y]<x)
x=c[po[o=i].y];
remove(o);
for (i=po[o].d;i!=o;i=po[i].d)
{
for(j=po[i].r;j!=i;j=po[j].r)
remove(po[j].y);
z=sc[(po[i].x-1)/N]*((po[i].x-1)%N+1);
map[(po[i].x-1)/N/N][(po[i].x-1)/N%N]=(po[i].x-1)%N+1;
if (z+now<ans)
if(dfs(z+now)) return(true);
for(j=po[i].l;j!=i;j=po[j].l)
resume(po[j].y);
}
resume(o);
return(false);
}
void print()
{
for(int i=0;i<N;i++)
{
if(i%3==0) printf("\n");
for(int j=0;j<N;j++)
if(j%3==0) printf(" %d ",map[i][j]);
else printf("%d ",map[i][j]);
printf("\n");
}
}
int main()
{
long time1,time2,time3;
time1=clock();
pre();
time2=clock();
dfs(0);
time3=clock();
if (ans<all)
printf("%d,%d\n",all,ans);
else
printf("No answer!");
print();
printf("%d,%d,%d\n",time2-time1,time3-time2,time3-time1);
getchar(); getchar();
}