ccy_dlx 模块化与全局变量7-8ms

来源:互联网 发布:base64encode linux 编辑:程序博客网 时间:2024/05/21 01:52

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();
}

 

原创粉丝点击