sudoku

Posted shadowland

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sudoku相关的知识,希望对你有一定的参考价值。

#include <bits/stdc++.h>

using namespace std ;

int orign_map[10][10],ans_map[10][10];
int ans_cnt ; 
int pos_x[100],pos_y[100];
bool buc_h[10][10],buc_l[10][10],buc_blc[4][4][10];


void dfs( int dep , int tot )
    if ( ans_cnt >= 2 ) return ;
    if ( dep==tot+1 )
        ++ ans_cnt ; 
        return ;
    
    for ( int i=1 ; i<=9 ; ++i ) 
        if( !buc_h[pos_x[dep]][i] && !buc_l[pos_y[dep]][i]&&!buc_blc[(pos_x[dep]-1)/3+1][(pos_y[dep]-1)/3+1][i]) 
            ans_map[pos_x[dep]][pos_y[dep]] = i ;
            buc_h[pos_x[dep]][i] = true;
            buc_l[pos_y[dep]][i] = true;
            buc_blc[(pos_x[dep]-1)/3+1][(pos_y[dep]-1)/3+1][i] = true;
            dfs( dep+1 , tot ) ; 
            buc_h[pos_x[dep]][i] = false;
            buc_l[pos_y[dep]][i] = false;
            buc_blc[(pos_x[dep]-1)/3+1][(pos_y[dep]-1)/3+1][i] = false;
            ans_map[pos_x[dep]][pos_y[dep]] = 0 ;
        
    


void generateOriginalMap()
    int order[]=0,1,2,3,4,5,6,7,8,9;
    srand(time(NULL));
    random_shuffle(order+1,order+10);
    for( int i=4 ; i<=6 ; ++i ) for ( int j=4 ; j<=6 ; ++j ) orign_map[i][j] = order[(i-4)*3+j-3];
    for (int i=4 ; i<=6 ; ++i ) for ( int j=1 ; j<=3 ; ++j ) orign_map[i][j] = orign_map[(i+1)%3+4][j+3];
    for (int i=4 ; i<=6 ; ++i ) for ( int j=7 ; j<=9 ; ++j ) orign_map[i][j] = orign_map[(i+1)%3+4][j-6];
    for (int i=4 ; i<=6 ; ++i ) for ( int j=1 ; j<=3 ; ++j ) orign_map[j][i] = orign_map[j+3][(i+1)%3+4];
    for (int i=4 ; i<=6 ; ++i ) for ( int j=7 ; j<=9 ; ++j ) orign_map[j][i] = orign_map[j-6][(i+1)%3+4];
    for (int i=7 ; i<=9 ; ++i ) for ( int j=1 ; j<=3 ; ++j ) orign_map[j][i] = orign_map[j+3][(i+1)%3+7];
    for (int i=7 ; i<=9 ; ++i ) for ( int j=7 ; j<=9 ; ++j ) orign_map[j][i] = orign_map[j-6][(i+1)%3+7];    
    for (int i=1 ; i<=3 ; ++i ) for ( int j=1 ; j<=3 ; ++j ) orign_map[j][i] = orign_map[j+3][(i+1)%3+1];
    for (int i=1 ; i<=3 ; ++i ) for ( int j=7 ; j<=9 ; ++j ) orign_map[j][i] = orign_map[j-6][(i+1)%3+1];


void generateSolution(int difficulty)
    for(int i=1;i<=9;++i)for(int j=1;j<=9;++j)ans_map[i][j] = orign_map[i][j];
    srand(time(NULL));
    int numOfBlank = 0 , randIndex ;
    bool isUsed[100];
    memset(isUsed,false,sizeof(isUsed));
    memset(buc_h,1,sizeof(buc_h));
    memset(buc_l,1,sizeof(buc_l));
    memset(buc_blc,1,sizeof(buc_blc));
    while (difficulty) 
        ans_cnt = 0 ; randIndex = rand()%81+1;
        if( isUsed[randIndex] ) continue;
        else 
            --difficulty;
            isUsed[randIndex] = true;

            int x = (randIndex-1)/9+1 , y = randIndex-(randIndex-1)/9*9; 

            pos_x[++numOfBlank] = x ;
            pos_y[numOfBlank] = y ;
            buc_h[x][orign_map[x][y]] = false ;
            buc_l[y][orign_map[x][y]] = false ;
            buc_blc[(x-1)/3+1][(y-1)/3+1][orign_map[x][y]] = false;

            ans_map[x][y]=0;
            dfs( 1 , numOfBlank ) ;

            if ( ans_cnt >= 2 ) 
                // cout << "illegal!!!!!"<<endl;
                --numOfBlank;
                buc_h[x][orign_map[x][y]] = true ;
                buc_l[y][orign_map[x][y]] = true ;
                buc_blc[(x-1)/3+1][(y-1)/3+1][orign_map[x][y]] = true;
                ans_map[x][y] = orign_map[x][y];
            
        
    
    

void output()
    int blank=0;
    cout << "Problem:\n" ;
    for ( int i=1 ; i<=9 ; ++i ) 
        for ( int j=1 ; j<=9 ; ++j ) 
            if(!ans_map[i][j])
                cout << "? ";
                blank++;
            
            else cout << ans_map[i][j] << " " ;
        
        cout << endl ; 
    
    cout << "Blank: " << blank << endl ; 
    cout << "-----------------\nAnswer:\n" ;
    for ( int i=1 ; i<=9 ; ++i ) 
        for ( int j=1 ; j<=9 ; ++j ) 
            cout << orign_map[i][j] << " " ;
        
        cout << endl ; 
    

int in()
    while(1)
        cout << "select difficulty:\n";
        cout << "1: easy     2: normal     3: hard     4:hard++\n" ;
        int a;cin >> a; 
        switch (a)
        
        case 1:
            return 35 ;
            break;
        case 2:
            return 40 ;
            break;
        case 3:
            return 55 ;
            break;
        case 4:
            return 68 ;
            break ; 
        default:
            cout << "illegal input\n" ;
            break;
        
    


int main( ) 
    generateOriginalMap();
    generateSolution(in());
    output();
    return 0 ;

 

以上是关于sudoku的主要内容,如果未能解决你的问题,请参考以下文章