逆夏de流年吧 关注:15贴子:346
  • 5回复贴,共1

新生研讨课之数独随机生成算法

只看楼主收藏回复

本贴主要讨论唯一解数独的生成算法。


IP属地:湖北1楼2020-01-24 19:19回复
    思路大致是这样的:首先用1~9的随机数填满1,5,9宫,然后用DLX解数独得到填满的终盘,然后进行挖洞,并进行唯一性判断,直到挖到指定数目的洞,这样就得到一个指定提示数的数独初盘。


    IP属地:湖北2楼2020-01-24 19:23
    回复
      代码新增如下:
      void random(){//生成1,5,9宫填满,其余宫均为0的数独
      srand(time(NULL));
      int store[9]={1,2,3,4,5,6,7,8,9};
      for(int k=0;k<3;k++){
      for(int i=0;i<100;i++){
      int a=rand()%9, b=rand()%9;
      int t;
      t=store[a];
      store[a]=store[b];
      store[b]=t;
      }
      for(int u=0;u<3;u++)
      for(int v=0;v<3;v++){
      int x=3*k+u,y=3*k+v;
      sudo[9*x+y]=store[3*u+v];
      }
      }
      }
      void create_sudoku(int n){//生成有n个提示数的数独初盘
      clock_t start = clock();
      int N=81-n;
      random();
      DLX(sudo);
      for(int i=0;i<81;i++)
      ans[i]=ans2[i];
      while(N){
      int k=rand()%81;
      if(ans[k]){
      int y=ans[k];
      ans[k]=0;
      int temp[81];
      for(int i=0;i<81;i++)
      temp[i]=ans[i];
      if(DLX(temp)==1) ans[k]=y;
      else N--;
      }
      }
      clock_t end = clock();
      for(int o=0;o<81;o++)
      printf("%d%c",ans[o],(o+1)%9?' ':'\n');
      float time=(float)(end-start)/CLOCKS_PER_SEC;
      printf("\ntime consumig: %.3f s\n",time);
      }


      IP属地:湖北3楼2020-01-24 19:24
      收起回复
        该写的不写,在这发什么玩意儿


        IP属地:北京来自Android客户端5楼2020-01-25 02:27
        收起回复