Advertisement
qwtomek

Sudoku

Feb 2nd, 2014
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<vector>
  4. using namespace std;
  5. #define for9(x) for(x=0; x<9; x++)
  6.  
  7. vector<short> temp;
  8. vector<vector<short> > wartosc(8, vector<short>(8));
  9. vector<vector<vector<short> > > czy(8,vector<vector<short> >(8, vector<short>(0))); //wektor tych wartości, których pole nie może przyjąć
  10.  
  11. void tempset()
  12. {
  13.     short i;
  14.     for9(i){
  15.         temp[i]=i+1;
  16.         }
  17. }
  18. void czysctemp()
  19. {
  20.     remove(temp.begin(), temp.end(), 0);
  21. }
  22. void usunztemp(short i)
  23. {
  24.     vector<short>::iterator it;
  25.     it = find(temp.begin(), temp.end(), i);
  26.     *it = 0;
  27. }
  28.  
  29.  
  30.  
  31. bool czy0 = false;
  32. void jesli0(short i)
  33. {
  34.     if(i==0) czy0 = true;
  35. }
  36. bool czycale()
  37. {
  38.     int i, j;
  39.     vector<short>::iterator it;
  40.     for9(i){
  41.         for_each(wartosc[i].begin(), wartosc[i].end(), jesli0);
  42.         if(czy0==true) return false;
  43.         }
  44.     return true;
  45. }
  46.  
  47.  
  48. short kwadrat(short x)
  49. {
  50.     if(x==0 || x==3 || x==6) return x;
  51.     if(x==1 || x==2) return 0;
  52.     if(x==4 || x==5) return 3;
  53.     if(x==7 || x==8) return 6;
  54. }
  55.  
  56. void ustaw(int i, int j)
  57. {
  58.     short k, l;
  59.     for9(k){
  60.         if(wartosc[i][k]==0)
  61.             if(count(czy[i][k].begin(), czy[i][k].end(), wartosc[i][j]) == 0)//sprawdz czy wartość nie została już zadeklarowana jako nie mogąca wystąpić
  62.                 czy[i][k].push_back(wartosc[i][j]); // zapisuj co nie możebyć w poziomo
  63.         }
  64.     for9(k){
  65.         if(wartosc[k][j]==0)
  66.             if(count(czy[i][k].begin(), czy[i][k].end(), wartosc[i][j]) == 0) //sprawdz czy wartość nie została  zadeklarowana jako nie mogąca wystąpić
  67.                 czy[k][j].push_back(wartosc[i][j]); // zapisuj co nie możebyć w pionowo
  68.         }
  69.     for(k=kwadrat(i); k<kwadrat(i)+3; k++){
  70.         for(l=kwadrat(j); l<kwadrat(j)+3; l++){
  71.             if(wartosc[k][l]==0)
  72.                 if(count(czy[i][k].begin(), czy[i][k].end(), wartosc[i][j]) == 0)//sprawdz czy wartość nie została zadeklarowana jako nie mogąca wystąpić
  73.                     czy[k][l].push_back(wartosc[i][j]); // zapisuj co nie może być w kwadracie
  74.             }
  75.         }
  76. }
  77.  
  78. int main()
  79. {
  80.     short i,j;
  81.     cout << "Podaj wartości pól sudoku\n";
  82.     for9(i){
  83.         for9(j){
  84.             cin >> wartosc[i][j];
  85.             cout << "OK";
  86.             if(wartosc[i][j]!=0) ustaw(i,j);
  87.             }
  88.         }
  89.     cout << "Zakończono wczytywanie\n";
  90.     while(!czycale()){
  91.         for9(i){
  92.             for9(j){
  93.                 if(wartosc[i][j]!=0){
  94.                     if(czy[i][j].size()==7){
  95.                         for_each(czy[i][j].begin(), czy[i][j].end(), usunztemp);
  96.                         czysctemp();
  97.                         wartosc[i][j]=temp[0];
  98.                         tempset();
  99.                     }
  100.                     if(wartosc[i][j]!=0) ustaw(i,j);
  101.                 }
  102.             }
  103.         }
  104.     for9(i){
  105.         for9(j){
  106.             cout << wartosc[i][j] << ' ';
  107.             }
  108.         cout << '\n';
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement