数独算法

接触这个游戏是最近一段时间,但苦苦思索程序算法终无结果,今早一袭灵感给了我很大启发,经过一天的调试和测试,终于有点成就,但还不够完善,现贴出来源代码如下:

 

import java.util.ArrayList;
import java.util.List;
public class Sudoku {
 public static List b=new ArrayList();
 public boolean Insert(int[][] a){
  if(MaxRow(a)==-1){
   Copy(a,b);
   //if(!Contains(a,b))
   //Print(b);
   return true;
  }
  int p=MaxRow(a);
  int q=0;
  for(int j=0;j<9;j++)
   if(a[p][j]==0)
    {q=j;break;}
  for(int i=1;i<10;i++)
   if(CanInsert(a,p,q,i)){
    a[p][q]=i;
    Insert(a);
    a[p][q]=0;
   }
  return true;
 }
 public void Print(List a){
  for(int i=0;i<a.size();i++){
   System.out.println("======================第"+i+1+"条========================");
       for(int t=0;t<81;t++){
        if(t%9==0)System.out.println();
      System.out.print(a.get(i).toString().charAt(t)+" ");
       }
       System.out.println();
  }
  System.out.println("============================================================");
 }
 public int MaxRow(int[][] a){//已填了数字格最多的行
  int q=0;
  int t=-1;
  int i=0,j=0;
  for(i=0;i<9;i++){
   int p=0;
   for(j=0;j<9;j++)
    if(a[i][j]!=0)p++;
   if(p!=9&&p>=q){q=p;t=i;}
  }
  return t;
 }

 public void Copy(int[][] a ,List b){
  StringBuffer bs=new StringBuffer();
  for(int i=0;i<9;i++)
   for (int j=0;j<9;j++)
    bs.append(a[i][j]);
  if(!b.contains(bs.toString()))b.add(bs.toString());
 }
 public boolean Contains(int[][] a ,List b){
  StringBuffer bs=new StringBuffer();
  for(int i=0;i<9;i++)
   for (int j=0;j<9;j++)
    bs.append(a[i][j]);
  if(!b.contains(bs.toString()))return true;
  return false;
 }
 public boolean CanInsert(int[][] a,int p,int q,int r){//数字r能否填在a[p][q]格子中
  boolean flag=true;
  for(int j=0;j<9;j++)
   if(a[p][j]==r)flag=false;
  for(int j=0;j<9;j++)
   if(a[j][q]==r)flag=false;
  for(int i=(p/3)*3;i<=(p/3)*3+2;i++)
   for(int j=(q/3)*3;j<=(q/3)*3+2;j++)
    if(a[i][j]==r)flag=false;
  return flag;
 }

 public static void main(String[] args) {
  // TODO Auto-generated method stub

  int[][] a=new int[9][9];
        a[0]=new int[]{9,0,0,0,0,5,0,0,7};
        a[1]=new int[]{3,0,0,0,6,0,2,0,0};
        a[2]=new int[]{1,0,0,8,0,0,0,4,0};
        a[3]=new int[]{6,0,0,0,0,0,0,0,1};
        a[4]=new int[]{0,0,0,5,0,3,0,0,0};
        a[5]=new int[]{2,0,0,0,0,0,0,0,9};
        a[6]=new int[]{0,9,0,0,0,7,0,0,3};
        a[7]=new int[]{0,0,8,0,4,0,0,0,6};
        a[8]=new int[]{5,0,0,1,0,0,0,0,2};
        int[][] b=new int[9][9];
  Sudoku s=new Sudoku();
  s.Insert(a);
  s.Print(s.b);
  System.out.println("共计有结果数:"+s.b.size());
 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值