首页 > 开发 > C > 正文

数独

2015-08-30 23:11:27  来源: 网友分享
语言:C环境:VC++6.0

             

#ifndef SUDOKU_RICK_0701_
#define SUDOKU_RICK_0701_class CSudoku
{   
 int map[9][9];    
 int smod;    
 int solves;    
 int check(int,int,int*);    
 void dfs();
 public:    enum{ANY=0,ALL=1};
    CSudoku(int n=40);// 随机生成数独,n越大越难
    CSudoku(int *data);// 人工指定数独
    virtual ~CSudoku();    void display();// 显示数独
    int resolve(int mod=ALL);// 解数独
    };
    #endif
    //#include "sudoku.h"
    #include "stdio.h"
    #include "stdlib.h"
    #include "time.h"
    CSudoku::CSudoku(int n)
{    int i,j;
    srand(time(0));    do
    {        for(i=0;i<9;++i)
        {            for(j=0;j<9;++j)
                map[i][j]=0;
            j=rand()%9;
            map[i][j]=i+1;
        }
    }    while(!resolve(ANY));    // 挖窟窿
    for(int k=0;k0)
        {
            map[i][j]=0;
            ++k;
        }

    }    //printf("(randomized sudoku created with %d blanks.)\n",blanks);}
CSudoku::CSudoku(int *data)
{    int *pm=(int*)map;    for(int i=0;i<81;++i)
        pm[i]=data[i];
}
CSudoku::~CSudoku()
{    return;
}void CSudoku::display()
{    for(int i=0;i<9;++i)
    {        for(int j=0;j0)
                printf("  ",map[i][j]);           
                 else
                printf("[   ]  ");
        }
        printf("\n");
    }
}
int CSudoku::resolve(int mod)
{
    smod=mod;    if(mod==ALL)
    {
        solves=0;
        dfs();        return solves;
    }    else if(mod==ANY)
    {        try
        {
            dfs();            
            return 0;
        }        
        catch(int)
        {           
         return 1;
        }
    }    r
    eturn 0;
}
int CSudoku::check(int y,int x,int *mark)
{    int i,j,is,js,count=0;    for(i=1;i<=9;++i)
        mark[i]=0;    for(i=0;i<9;++i)
        mark[map[y][i]]=1;    for(i=0;i<9;++i)
        mark[map[i][x]]=1;
    is=y/3*3;
    js=x/3*3;    for(i=0;i<3;++i)
    {        for(j=0;j<3;++j)
            mark[map[is+i][js+j]]=1;
    }    for(i=1;i<=9;++i)        if(mark[i]==0)
            count++;        
            return count;
}
void CSudoku::dfs()
{   
 int i,j,im=-1,jm,min=10;    int mark[10];    for(i=0;i<9;++i)
    {        for(j=0;j<9;++j)
        {           
         if(map[i][j]) 
                        continue;           
                         int c=check(i,j,mark);           
                          if(c==0)                
                          return;           
                           if(c<min)
            {
                im=i;
                jm=j;
                min=c;
            }
        }
    }   
     if(im==-1)
    {       
     if(smod==ALL)
        {
            printf("No. %d:\n",++solves);
            display();            
            return;
        }        
        else if(smod==ANY)
        {           
         throw(1);
        }
    }
    check(im,jm,mark);   
     for(i=1;i<=9;++i)
    {        
    if(mark[i]==0)
        {
            map[im][jm]=i;
            dfs();
        }
    }
    map[im][jm]=0;
}
#include //
#include "sudoku.h"
using namespace std;
int main()
{    int data1[]=
    {4,9,0,0,0,6,0,2,7,
    5,0,0,0,1,0,0,0,4,
    6,0,0,0,0,8,0,0,3,
    1,0,4,0,0,0,0,0,0,
    0,6,0,0,0,0,0,5,0,
    0,0,0,0,0,0,2,0,8,
    7,0,0,2,0,0,0,0,5,
    8,0,0,0,9,0,0,0,1,
    3,4,0,5,0,0,0,6,2
    };    int data2[]=
    {7,4,0,0,8,0,0,1,6,
    9,0,0,0,3,5,0,0,4,
    0,0,0,7,0,0,0,0,0,
    0,7,0,0,0,9,5,0,0,
    6,1,0,0,5,0,0,8,7,
    0,0,2,6,0,0,0,4,0,
    0,0,0,0,0,4,0,0,0,
    3,0,0,5,6,0,0,0,2,
    5,6,0,0,1,0,0,3,9
    };    int data3[]=
    {
        0,0,3,0,0,0,0,0,4,
        9,0,0,0,0,3,0,5,0,
        2,0,0,7,0,0,0,0,0,
        0,8,0,0,1,0,0,0,6,
        0,3,0,2,0,0,0,9,0,
        4,0,0,0,0,0,0,1,0,
        0,0,0,0,0,8,0,0,3,
        0,6,0,9,0,0,0,0,8,
        5,0,0,0,0,0,2,0,0//         0,3,0,9,0,0,0,1,0,//     0,8,0,0,0,0,0,7,0,//     7,0,2,4,0,0,9,0,0,//     0,7,0,0,1,0,0,4,0,//     1,0,0,0,0,6,0,0,9,//     0,6,0,0,0,0,0,3,0,//     0,0,8,0,0,9,5,0,3,//     0,1,0,0,0,0,0,9,0,//     0,9,0,0,0,2,0,6,0
    };    int blanks;
    cout<>blanks;
    CSudoku s(blanks);
    s.display();
    cout<<"开始解数独:"<<endl;
    s.resolve();    
    cout<<"解数独:"<<endl;
    CSudoku t(data3);
    t.display();
    cout<<"开始解数独:"<<endl;
    t.resolve(1);    
    return 0;
}


上一篇:储油问题
下一篇:汉诺塔-非递归