最近迷上了数独游戏,玩多了,都是别人出好的题目,就想自己也能生成题目,不过算法实在是搞不定,我在算法方面没什么经验,不知道这里有没有哪位大侠能有解数独的规则很简单,就是3x3共9个九宫格,组成9x9共81个格子。其中每个九宫格只能填1-9不能重复的数字,同时每一行以及每一列也都只能出现1-9不能重复的数字。表达能力有限,不知道说的够不够清楚,希望大家不吝赐教!

解决方案 »

  1.   


    第一行 A1A2A3   A4A5A6   A7A8A9  (1..9随便填) 
    第二行 A4A5A6   A7A8A9   A1A2A3  (由第一行以3个数为基准循环左移一次)
    第三行 A7A8A9   A1A2A3   A4A5A6  (由第二行以3个数为基准循环左移一次)第四行 A2A3A1   A5A6A4   A8A9A7  (由第一行作3个数的内部循环左移一次)
    第五行 A5A6A4   A8A9A7   A2A3A1  (由第四行以3个数为基准循环左移一次)
    第六行 A8A9A7   A2A3A1   A5A6A4  (由第五行以3个数为基准循环左移一次)第七行 A3A1A2   A6A4A5   A9A7A8  (由第四行作3个数的内部循环左移一次)
    第八行 A6A4A5   A9A7A8   A3A1A2  (由第七行以3个数为基准循环左移一次)
    第九行 A9A7A8   A3A1A2   A6A4A5  (由第八行以3个数为基准循环左移一次)
    应该还有很多的生成办法
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j,k,m,n,x,y:Integer;
      A:array[1..9,1..9] of Integer;
      s:string;
      t:array[1..9] of integer;
    Label TryAgain;
    begin
      for i:=1 to 9 do
        for j:=1 to 9 do
          A[i,j]:=0;
      Randomize();TryAgain:  for i:=1 to 9 do
        for j:=1 to 9 do
        begin
          for k:=1 to 9 do
            t[k]:=0;
          for m:=1 to i-1 do
            t[A[m,j]]:=1;
          for n:=1 to j-1 do
            t[A[i,n]]:=1;      s:='';
          for k:=1 to 9 do
            if t[k]=0 then
              s:=s+inttostr(k);
          if s='' then
            goto  TryAgain;
          x:=Length(s);
          y:=Random(x)+1;      A[i,j]:=strtoint(Copy(s,y,1));    end;  s:='';
      for i:=1 to 9 do
      begin
        for j:=1 to 9 do
          s:=s+inttostr(A[i,j]);
        s:=s+Chr(13);
      end;  RichEdit1.Text :=s;end;
      

  3.   

    感谢sjtuyjc(sjtuyjc)!
    我上次的求解?不好意思,已经忘记是哪个了,你能说具体点吗?