Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- bool row[10][10],col[10][10],sqr[10][10];
- int a[10][10];
- bool row2[10][10],col2[10][10],sqr2[10][10];
- int a2[10][10];
- char c[9][10];
- bool ok;
- bool nadole()
- {
- int i,j,k,x,y,z,broj,nekoj,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0,p8=0,p9=0,g1=0,g2=0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,h1=0,h2=0,h3=0,h4=0,h5=0,h6=0,h7=0,h8=0,h9=0,bla;
- gore:
- if (a[1][1]==a2[1][1] &&a[1][2]==a2[1][2] && a[1][3]==a2[1][3])
- {
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- {
- a2[i][j]=a[i][j];
- }
- }
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- if (a2[i][j]==0)
- {
- nekoj=0; bla=0;
- for (broj=1;broj<=9;broj++)
- if (row2[i][broj]==false && col2[j][broj]==false && sqr2[(i-1)/3*3+(j-1)/3+1][broj]==false){ nekoj++; bla=broj; }
- if (nekoj==1)
- if (b4!=0)
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- b7=i;
- b8=j;
- b9=(i-1)/3*3+(j-1)/3+1;
- goto onaka;
- } else
- if (b1!=0)
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- b4=i;
- b5=j;
- b6=(i-1)/3*3+(j-1)/3+1;
- goto gore;
- }
- else
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- b1=i;
- b2=j;
- b3=(i-1)/3*3+(j-1)/3+1;
- goto gore;
- }
- }
- onaka:
- for (broj=1;broj<=9;broj++)
- {
- for (i=0;i<=2;i++)
- for (j=0;j<=2;j++)
- {
- nekoj=0;
- if (sqr2[i*3+(j+1)][broj]) continue;
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a2[(i*3)+x][(j*3)+y]!=0 || (row2[(i*3)+x][broj]) || (col2[(j*3)+y][broj])) nekoj++;
- if (nekoj==8)
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a2[(i*3)+x][(j*3)+y]==0 && !row2[(i*3)+x][broj] && !col2[(j*3)+y][broj])
- if (g4!=0){
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- g7=(i*3)+x;
- g8=(j*3)+y;
- g9=(i*3)+j+1;
- goto skip2;
- } else
- if (g1!=0){
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- g4=(i*3)+x;
- g5=(j*3)+y;
- g6=(i*3)+j+1;
- goto onaka;
- } else
- if (p7!=0)
- {
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- g1=(i*3)+x;
- g2=(j*3)+y;
- g3=(i*3)+j+1;
- goto onaka;
- } else
- if (p4!=0){
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- p7=(i*3)+x;
- p8=(j*3)+y;
- p9=(i*3)+j+1;
- goto onaka;
- } else
- if (p1!=0){
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- p4=(i*3)+x;
- p5=(j*3)+y;
- p6=(i*3)+j+1;
- goto onaka;
- } else
- {
- a2[(i*3)+x][(j*3)+y]=broj;
- row2[(i*3)+x][broj]=true;
- col2[(j*3)+y][broj]=true;
- sqr2[(i*3)+j+1][broj]=true;
- p1=(i*3)+x;
- p2=(j*3)+y;
- p3=(i*3)+j+1;
- goto onaka;
- }
- }
- }
- skip2:
- if (p1!=0)
- {
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- if (a2[i][j]==0)
- {
- nekoj=0; bla=0;
- for (broj=1;broj<=9;broj++)
- if (row2[i][broj]==false && col2[j][broj]==false && sqr2[(i-1)/3*3+(j-1)/3+1][broj]==false){ nekoj++; bla=broj; }
- if (nekoj==1)
- if (h4!=0)
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- h7=i;
- h8=j;
- h9=(i-1)/3*3+(j-1)/3+1;
- goto dandam;
- }
- else
- if (h1!=0)
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- h4=i;
- h5=j;
- h6=(i-1)/3*3+(j-1)/3+1;
- goto skip2;
- }
- else
- {
- row2[i][bla]=true;
- col2[j][bla]=true;
- sqr2[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a2[i][j]=bla;
- h1=i;
- h2=j;
- h3=(i-1)/3*3+(j-1)/3+1;
- goto skip2;
- }
- }
- }
- dandam:
- for (i = 1; i < 10; ++i)
- for (j = 1; j < 10; ++j)
- {
- if (a2[i][j] == 0)
- {
- for (k = 9; k > 0; --k)
- {
- if (!row2[i][k] && !col2[j][k] && !sqr2[(i-1)/3*3+(j-1)/3+1][k])
- {
- a2[i][j] = k;
- row2[i][k] = true;
- col2[j][k] = true;
- sqr2[(i-1)/3*3+(j-1)/3+1][k] = true;
- if (nadole())
- return true;
- else
- {
- a2[i][j] = 0;
- row2[i][k] = false;
- col2[j][k] = false;
- sqr2[(i-1)/3*3+(j-1)/3+1][k] = false;
- }
- }
- }
- if (k == 0){
- if (h1!=0)
- {
- row2[h1][a2[h1][h2]]=false;
- col2[h2][a2[h1][h2]]=false;
- sqr2[h3][a2[h1][h2]]=false;
- a2[h1][h2]=0;
- h1=0;
- h2=0;
- h3=0;
- }
- if (h4!=0)
- {
- row2[h4][a2[h4][h5]]=false;
- col2[h5][a2[h4][h5]]=false;
- sqr2[h6][a2[h4][h5]]=false;
- a2[h4][h5]=0;
- h4=0;
- h5=0;
- h6=0;
- }
- if (h7!=0)
- {
- row2[h7][a2[h7][h8]]=false;
- col2[h8][a2[h7][h8]]=false;
- sqr2[h9][a2[h7][h8]]=false;
- a2[h7][h8]=0;
- h7=0;
- h8=0;
- h9=0;
- }
- if (b1!=0)
- {
- row2[b1][a2[b1][b2]]=false;
- col2[b2][a2[b1][b2]]=false;
- sqr2[b3][a2[b1][b2]]=false;
- a2[b1][b2]=0;
- b1=0;
- b2=0;
- b3=0;
- }
- if (b4!=0)
- {
- row2[b4][a2[b4][b5]]=false;
- col2[b5][a2[b4][b5]]=false;
- sqr2[b6][a2[b4][b5]]=false;
- a2[b4][b5]=0;
- b4=0;
- b5=0;
- b6=0;
- }
- if (b7!=0)
- {
- row2[b7][a2[b7][b8]]=false;
- col2[b8][a2[b7][b8]]=false;
- sqr2[b9][a2[b7][b8]]=false;
- a2[b7][b8]=0;
- b7=0;
- b8=0;
- b9=0;
- }
- if (p7!=0)
- {
- row2[p7][a2[p7][p8]]=false;
- col2[p8][a2[p7][p8]]=false;
- sqr2[p9][a2[p7][p8]]=false;
- a2[p7][p8]=0;
- p7=0;
- p8=0;
- p9=0;
- }
- if (p4!=0)
- {
- row2[p4][a2[p4][p5]]=false;
- col2[p5][a2[p4][p5]]=false;
- sqr2[p6][a2[p4][p5]]=false;
- a2[p4][p5]=0;
- p4=0;
- p5=0;
- p6=0;
- }
- if (p1!=0)
- {
- row2[p1][a2[p1][p2]]=false;
- col2[p2][a2[p1][p2]]=false;
- sqr2[p3][a2[p1][p2]]=false;
- a2[p1][p2]=0;
- p1=0;
- p2=0;
- p3=0;
- }
- if (g1!=0)
- {
- row2[g1][a2[g1][g2]]=false;
- col2[g2][a2[g1][g2]]=false;
- sqr2[g3][a2[g1][g2]]=false;
- a2[g1][g2]=0;
- g1=0;
- g2=0;
- g3=0;
- }
- if (g4!=0)
- {
- row2[g4][a2[g4][g5]]=false;
- col2[g5][a2[g4][g5]]=false;
- sqr2[g6][a2[g4][g5]]=false;
- a2[g4][g5]=0;
- g4=0;
- g5=0;
- g6=0;
- }
- if (g7!=0)
- {
- row2[g7][a2[g7][g8]]=false;
- col2[g8][a2[g7][g8]]=false;
- sqr2[g9][a2[g7][g8]]=false;
- a2[g7][g8]=0;
- g7=0;
- g8=0;
- g9=0;
- }
- return false;}
- }
- }
- return true;
- }
- bool nagore()
- {
- int i,j,k,x,y,z,broj,nekoj,p1=0,p2=0,p3=0,p4=0,p5=0,p6=0,p7=0,p8=0,p9=0,g1=0,g2=0,g3=0,g4=0,g5=0,g6=0,g7=0,g8=0,g9=0,b1=0,b2=0,b3=0,b4=0,b5=0,b6=0,b7=0,b8=0,b9=0,bla,h1=0,h2=0,h3=0,h4=0,h5=0,h6=0,h7=0,h8=0,h9=0;
- gor:
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- if (a[i][j]==0)
- {
- nekoj=0; bla=0;
- for (broj=1;broj<=9;broj++)
- if (row[i][broj]==false && col[j][broj]==false && sqr[(i-1)/3*3+(j-1)/3+1][broj]==false){ nekoj++; bla=broj; }
- if (nekoj==1)
- if (b4!=0)
- {
- row[i][bla]=true;
- col[j][bla]=true;
- sqr[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a[i][j]=bla;
- b7=i;
- b8=j;
- b9=(i-1)/3*3+(j-1)/3+1;
- goto onak;
- } else
- if (b1!=0)
- {
- row[i][bla]=true;
- col[j][bla]=true;
- sqr[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a[i][j]=bla;
- b4=i;
- b5=j;
- b6=(i-1)/3*3+(j-1)/3+1;
- goto gor;
- } else
- {
- row[i][bla]=true;
- col[j][bla]=true;
- sqr[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a[i][j]=bla;
- b1=i;
- b2=j;
- b3=(i-1)/3*3+(j-1)/3+1;
- goto gor;
- }
- }
- onak:
- for (broj=1;broj<=9;broj++)
- {
- for (i=0;i<=2;i++)
- for (j=0;j<=2;j++)
- {
- nekoj=0;
- if (sqr[i*3+(j+1)][broj]) continue;
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a[(i*3)+x][(j*3)+y]!=0 || (row[(i*3)+x][broj]) || (col[(j*3)+y][broj])) nekoj++;
- if (nekoj==8)
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a[(i*3)+x][(j*3)+y]==0 && !row[(i*3)+x][broj] && !col[(j*3)+y][broj])
- if (g4!=0){
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- g7=(i*3)+x;
- g8=(j*3)+y;
- g9=(i*3)+j+1;
- goto skip;
- } else
- if (g1!=0){
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- g4=(i*3)+x;
- g5=(j*3)+y;
- g6=(i*3)+j+1;
- goto onak;
- } else
- if (p7!=0)
- {
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- g1=(i*3)+x;
- g2=(j*3)+y;
- g3=(i*3)+j+1;
- goto onak;
- } else
- if (p4!=0){
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- p7=(i*3)+x;
- p8=(j*3)+y;
- p9=(i*3)+j+1;
- goto onak;
- } else
- if (p1!=0){
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- p4=(i*3)+x;
- p5=(j*3)+y;
- p6=(i*3)+j+1;
- goto onak;
- } else
- {
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- p1=(i*3)+x;
- p2=(j*3)+y;
- p3=(i*3)+j+1;
- goto onak;
- }
- }
- }
- skip:
- if (p1!=0)
- {
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- if (a[i][j]==0)
- {
- nekoj=0; bla=0;
- for (broj=1;broj<=9;broj++)
- if (row[i][broj]==false && col[j][broj]==false && sqr[(i-1)/3*3+(j-1)/3+1][broj]==false){ nekoj++; bla=broj; }
- if (nekoj==1)
- if (h1!=0)
- {
- row[i][bla]=true;
- col[j][bla]=true;
- sqr[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a[i][j]=bla;
- h4=i;
- h5=j;
- h6=(i-1)/3*3+(j-1)/3+1;
- goto danda;
- }
- else
- {
- row[i][bla]=true;
- col[j][bla]=true;
- sqr[(i-1)/3*3+(j-1)/3+1][bla]=true;
- a[i][j]=bla;
- h1=i;
- h2=j;
- h3=(i-1)/3*3+(j-1)/3+1;
- goto skip;
- }
- }
- }
- danda:
- for (i = 1; i < 10; ++i)
- for (j = 1; j < 10; ++j)
- {
- if (a[i][j] == 0)
- {
- for (k = 1; k < 10; ++k)
- {
- if (!row[i][k] && !col[j][k] && !sqr[(i-1)/3*3+(j-1)/3+1][k])
- {
- a[i][j] = k;
- row[i][k] = true;
- col[j][k] = true;
- sqr[(i-1)/3*3+(j-1)/3+1][k] = true;
- if (nagore())
- return true;
- else
- {
- a[i][j] = 0;
- row[i][k] = false;
- col[j][k] = false;
- sqr[(i-1)/3*3+(j-1)/3+1][k] = false;
- }
- }
- }
- if (k == 10){
- if (h1!=0)
- {
- row[h1][a[h1][h2]]=false;
- col[h2][a[h1][h2]]=false;
- sqr[h3][a[h1][h2]]=false;
- a[h1][h2]=0;
- h1=0;
- h2=0;
- h3=0;
- }
- if (h4!=0)
- {
- row[h4][a[h4][h5]]=false;
- col[h5][a[h4][h5]]=false;
- sqr[h6][a[h4][h5]]=false;
- a[h4][h5]=0;
- h4=0;
- h5=0;
- h6=0;
- }
- if (b1!=0)
- {
- row[b1][a[b1][b2]]=false;
- col[b2][a[b1][b2]]=false;
- sqr[b3][a[b1][b2]]=false;
- a[b1][b2]=0;
- b1=0;
- b2=0;
- b3=0;
- } if (b4!=0)
- {
- row[b4][a[b4][b5]]=false;
- col[b5][a[b4][b5]]=false;
- sqr[b6][a[b4][b5]]=false;
- a[b4][b5]=0;
- b4=0;
- b5=0;
- b6=0;
- }
- if (b7!=0)
- {
- row[b7][a[b7][b8]]=false;
- col[b8][a[b7][b8]]=false;
- sqr[b9][a[b7][b8]]=false;
- a[b7][b8]=0;
- b7=0;
- b8=0;
- b9=0;
- }
- if (g7!=0)
- {
- row[g7][a[g7][g8]]=false;
- col[g8][a[g7][g8]]=false;
- sqr[g9][a[g7][g8]]=false;
- a[g7][g8]=0;
- g7=0;
- g8=0;
- g9=0;
- }
- if (p7!=0)
- {
- row[p7][a[p7][p8]]=false;
- col[p8][a[p7][p8]]=false;
- sqr[p9][a[p7][p8]]=false;
- a[p7][p8]=0;
- p7=0;
- p8=0;
- p9=0;
- }
- if (p4!=0)
- {
- row[p4][a[p4][p5]]=false;
- col[p5][a[p4][p5]]=false;
- sqr[p6][a[p4][p5]]=false;
- a[p4][p5]=0;
- p4=0;
- p5=0;
- p6=0;
- }
- if (p1!=0)
- {
- row[p1][a[p1][p2]]=false;
- col[p2][a[p1][p2]]=false;
- sqr[p3][a[p1][p2]]=false;
- a[p1][p2]=0;
- p1=0;
- p2=0;
- p3=0;
- }
- if (g1!=0)
- {
- row[g1][a[g1][g2]]=false;
- col[g2][a[g1][g2]]=false;
- sqr[g3][a[g1][g2]]=false;
- a[g1][g2]=0;
- g1=0;
- g2=0;
- g3=0;
- }
- if (g4!=0)
- {
- row[g4][a[g4][g5]]=false;
- col[g5][a[g4][g5]]=false;
- sqr[g6][a[g4][g5]]=false;
- a[g4][g5]=0;
- g4=0;
- g5=0;
- g6=0;
- }
- return false;}
- }
- }
- return true;
- }
- int main()
- {
- ok=true;
- int i,j,x,y,z,broj,nekoj;
- for (i = 0; i < 9; ++i)
- cin >> c[i];
- for (i = 1; i < 10; ++i)
- {
- for (j = 1; j < 10; ++j)
- {
- if (c[i-1][j-1]=='.') {a2[i][j]=0; a[i][j]=0;} else
- { a[i][j] = c[i-1][j-1] - '0'; a2[i][j] = c[i-1][j-1] - '0'; }
- row[i][a[i][j]] = true;
- col[j][a[i][j]] = true;
- sqr[(i-1)/3*3+(j-1)/3+1][a[i][j]] = true;
- row2[i][a[i][j]] = true;
- col2[j][a[i][j]] = true;
- sqr2[(i-1)/3*3+(j-1)/3+1][a[i][j]] = true;
- }
- }
- z:
- for (broj=1;broj<=9;broj++)
- {
- for (i=0;i<=2;i++)
- for (j=0;j<=2;j++)
- {
- nekoj=0;
- if (sqr[i*3+(j+1)][broj]) continue;
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a[(i*3)+x][(j*3)+y]!=0 || (row[(i*3)+x][broj]) || (col[(j*3)+y][broj])) nekoj++;
- if (nekoj==8)
- for (x=1;x<=3;x++)
- for (y=1;y<=3;y++)
- if (a[(i*3)+x][(j*3)+y]==0 && !row[(i*3)+x][broj] && !col[(j*3)+y][broj])
- {
- // cout<<(i*3)+x<<(j*3)+y<<broj<<endl;
- a[(i*3)+x][(j*3)+y]=broj;
- row[(i*3)+x][broj]=true;
- col[(j*3)+y][broj]=true;
- sqr[(i*3)+j+1][broj]=true;
- goto z;
- }
- }
- }
- for (i=1;i<=9;i++)
- for (j=1;j<=9;j++)
- {
- a2[i][j]=a[i][j];
- row2[i][j]=row[i][j];
- col2[i][j]=col[i][j];
- sqr2[i][j]=sqr[i][j];
- }
- if (!ok) cout<<"IMPOSSIBLE" ; else
- {
- nagore();
- for (int i = 1; i < 10; ++i)
- for (int j = 1; j < 10; ++j)
- if (a[i][j]==0) { cout<<"IMPOSSIBLE" ; goto top; } else
- {
- for (i = 1; i < 10; ++i)
- {
- for (j = 1; j < 10; ++j)
- cout << a[i][j];
- cout << endl;
- }
- cout << endl;
- nadole();
- for (int i = 1; i < 10; ++i)
- for (int j = 1; j < 10; ++j)
- if (a[i][j]!=a2[i][j])
- {
- for (i = 1; i < 10; ++i)
- {
- for (j = 1; j < 10; ++j)
- cout << a2[i][j];
- cout << endl;
- }
- break;
- }
- }}
- top:// system ("PAUSE");
- return 0;
- }
Add Comment
Please, Sign In to add comment