Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by code ( 12 years ago )
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std; 

bool b=true;

int m=10,kol =0;

int s[][9]={1,0,9,0,0,0,0,0,0
           ,0,0,0,0,0,8,7,0,2
           ,0,0,2,0,0,5,0,3,0
           ,0,0,0,0,0,0,9,2,8
           ,0,0,0,0,2,0,0,0,0
           ,0,0,0,7,5,4,0,0,0
           ,9,4,0,3,0,0,0,0,0
           ,0,0,0,1,0,0,0,6,4
           ,0,2,0,0,0,0,0,8,0};

int sudo[9][9][100]; 



class point{
    bool row_col(int f,int k)
    {
        for (int i=0;i<9;i++) if (sudo[i][y][k]==f) return false;
        for (int i=0;i<9;i++) if (sudo[x][i][k]==f) return false;
        return true;
    }

    bool subset(int f,int k)
    {
        if (x>=0 && x<=2 && y<=2 && y>=0) {for (int i=0;i<3;i++) for (int j=0;j<3;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=3 && x<=5 && y<=2 && y>=0) {for (int i=3;i<6;i++) for (int j=0;j<3;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=6 && x<=8 && y<=2 && y>=0) {for (int i=6;i<9;i++) for (int j=0;j<3;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=0 && x<=2 && y<=5 && y>=3) {for (int i=0;i<3;i++) for (int j=3;j<6;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=3 && x<=5 && y<=5 && y>=3) {for (int i=3;i<6;i++) for (int j=3;j<6;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=6 && x<=8 && y<=5 && y>=3) {for (int i=6;i<9;i++) for (int j=3;j<6;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=0 && x<=2 && y<=8 && y>=6) {for (int i=0;i<3;i++) for (int j=6;j<9;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=3 && x<=5 && y<=8 && y>=6) {for (int i=3;i<6;i++) for (int j=6;j<9;j++) if (sudo[i][j][k]==f) return false;}
        else if (x>=6 && x<=8 && y<=8 && y>=6) {for (int i=6;i<9;i++) for (int j=6;j<9;j++) if (sudo[i][j][k]==f) return false;}
        return true;
    }
public:

    int var[9];// массив вариантов

    int var_count;// количество вариантов
   
    int x,y; // координаты

    bool get_var(int k) // сбор вариантов
    {
        var_count=-1;
        if (sudo[x][y][k]) {var_count=10; return false;} else 
            for (int i=1;i<10;i++) 
                if (row_col(i,k)) if (subset(i,k)) {var_count ++;var[var_count] = i;}
        if (var_count==0) {
            sudo[x][y][k]=var[0];
            var_count=10;
            return true;
        }
        m=min(var_count,m);
        return false;
    }
};


point a[9][9];

 
 void pris(int k);
 bool end(int k);
 void recursion();
 void show(int k);
 void take_vars(int k);


int main ()
{
    setlocale(LC_ALL,"Russian");
    for (int i=0;i<9;i++)
        for (int j=0;j<9;j++){
            sudo[i][j][0]=s[i][j];
            a[i][j].x=i;
            a[i][j].y=j;
        }
    show(0);
    take_vars(0);
    show(0);
    recursion();
    return 0;
}




void pris(int k)
{
    for (int i=0;i<9;i++)
        for (int j=0;j<9;j++)
            sudo[i][j][k]=sudo[i][j][k-1];
}


bool end(int k)// проверка конца решения
{
    for (int i=0;i<9;i++)
        for (int j=0;j<9;j++)
            if (!sudo[i][j][k]) return false;
    return true;
}

void recursion() // рекурсия
{   
    pris(++kol);
    for (int i=0;i<9;i++)
        for (int j=0;j<9;j++){
            if (a[i][j].var_count==m) {
                b=true;
                for (int g=0;g<=m;g++){
                    pris(kol);
                    sudo[i][j][kol]=a[i][j].var[g];
                    show(kol);
                    take_vars(kol);
                    show(kol);
                    if (!b) break;
                    else if (end(kol)) {show(kol);return;}
                    recursion();
                }
            }
        }
}

void show(int k)// вывод на экран 
{
    for (int i=0;i<9;i++){
        cout << endl;
        if (i%3==0) cout << endl;
        for (int j=0;j<9;j++){
            cout << sudo[i][j][k] << ' ';
            if ((j+1)%3==0) cout << "  ";
        }
    }
    cout << endl << endl << endl;
}    


void  take_vars(int k) // получение вариантов
{
    m=10;
    for (int i=0;i<9;i++)
        for (int j=0;j<9;j++)
            if (a[i][j].get_var(k)) { take_vars(k); return;}
            else if (a[i][j].var_count==-1) {b=false;break;}
}

 

Revise this Paste

Your Name: Code Language: