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 ;
}

 

posted @ 2019-07-26 22:29  SHHHS  阅读(99)  评论(0编辑  收藏