µ±Ç°Î»ÖÃ: Ê×Ò³ >> ³ÌÐòÉè¼Æ >> ÓÎÏ·¿ª·¢ >> Êý¶ÀÓÎÏ·±à³Ì
 

Êý¶ÀÓÎÏ·±à³Ì

×÷Õߣºyexin218      À´Ô´£ºyexin218.cublog.cn     ·¢±íʱ¼ä£º2006-11-17     ä¯ÀÀ´ÎÊý£º      ×ֺţº´ó  ÖР Ð¡

Êý¶ÀÊÇÒ»ÖÖÓÐȤµÄÈÕ±¾ÃÔÌâÓÎÏ·¡£Êý¶ÀÓÎϷʹÓÃÊý×Ö£¬µ«²»ÐèÒªÊýѧ£¬ÕâÒ²ÊÇËüΪʲôÈç´ËÊÜ»¶Ó­µÄÔ­Òò¡£Èç¹ûÄúÕýÔÚѰÕÒÃâ·ÑµÄÊý¶ÀÓÎÏ·£¬ÎÞÐèÐÁ¿àËÑË÷¡£ÔÚ www.sudoku.name£¬ÄúÄܹ»ÕÒµ½ÊýǧÖÖÔÚÏßÊý¶ÀÃÔÌâÓÎÏ·£¬¿É¹©ÄúÃâ·ÑÌåÑé¡£ÄúÖ»ÐèÁË½â¹æÔò£¬»¨Ò»µãʱ¼ä£¬±ãÄÜ¿ªÊ¼ÏíÊÜÊý¶ÀÓÎÏ·µÄÀÖȤ¡£

Êý¶ÀÓÎÏ·Äܹ»´Ù½øÎÒÃÇÿ¸öÈ˵ĴóÄÔºÍÂß¼­ÐÔ¡£Ñо¿±íÃ÷£¬ÍæÊý¶ÀÓÎÏ·Äܹ»Ìá¸ß¼ÇÒäÁ¦ºÍÍ·ÄÔÇåÎú¶È£¬ÉõÖÁ¿ÉÒÔÖÎÁƺÍÔ¤·ÀÀÏÄê³Õ´ôÖ¢µÈ´óÄÔ¼²²¡£¡Òò´Ë£¬Ò»Ð©¿ÆÑ§¼ÒºÍÑо¿ÈËÔ±½¨Ò齫Êý¶ÀÓÎÏ·×÷ΪÈÕ³£»î¶¯µÄÒ»²¿·Ö¡£

Á˽âĿǰ×îÁ÷ÐеÄÓÎÏ·£¬¼ÓÈëÕâ¸ö21ÊÀ¼ÍµÄÈ«Çò¾«²Ê³±Á÷£¬¿ªÊ¼ÏíÊÜÊý¶ÀÓÎÏ·¡­¡­

ok, let us go to have fun: SODU

Õâ¸öÒѾ­ÊÇÉÏѧÆÚµÄÒ»¸öproject.½ñÌìͻȻÓÐÈ˸úÎÒÌáǰÕâ¸öÓÎÏ·µÄ±à³Ì£¬ÏëÏëµ±³õÒ²·ÑÁ˲»ÉÙÄԽ°¾Á˼¸¸öÍíÉÏ£¬Ð´ÁË600¶àÐеĴúÂ룬ȻºóÓÖ·´¸´²âÑ飬Ð޸ĵ½400¶à£¬ºÇºÇ£¬ÏÈ¿´¿´£ºµ±³õÍêÈ«Êǰ´ÕÕ×Ô¼ºµÄÏ뷨дµÄ£¬ºÜ²»Áé»î¡£µ«ÊÇŬÁ¦ÁË£¬ÓÐÒ»¶¨µÄÊÕ»ñ¡£Æäʵµ±Ê±ÐÄÀïºÜ¸ßÐË£¬¼´Ê¹Ð޸ĺó»¹ÊDz»Äܽâ¾öËùÓеÄÊý¶ÀÓÎÏ·¡£

#include <iostream>
#include <iomanip>
using namespace std;
int check_Num(int,int);
 int check_Line(int ,int );
 int check_Table(int ,int,int);
 int check_Column(int ,int );
 int check_EachLine_Num(int,int,int);
 int check_column_table(int ,int ,int );

 int check_column_num_zero(int ,int );
 int check_column_samenum(int ,int );
 int check_which_table_line(int ,int ,int );
 int check_which_table_column(int ,int ,int );
 void check_only_line(int p);
void check_only_col(int q);
void check_nine_table(int m,int n);
void check_only_two(int i,int j);
int checkSame_two_table(int t,int x,int y);
 int A[9][9] =
    {
{1,0,0,8,3,0,0,0,2},
{5,7,0,0,0,1,0,0,0},
{0,0,0,5,0,9,0,6,4},
{7,0,4,0,0,8,5,9,0},
{0,0,3,0,1,0,4,0,0},
{0,5,1,4,0,0,3,0,6},
{3,6,0,7,0,4,0,0,0},
{0,0,0,6,0,0,0,7,9},
{8,0,0,0,5,2,0,0,3}
    };


   int row,column, rowc,columnc;
   int c[3]={0};
   int d[3]={0};
   //int g[3]={0};


   int NO=0;
   int e[3]={0};
   int f[3] ={0};
   int h[3]={0};

int main()
{
for(int w=0;w<3;w++){
cout<<"%%%%%%%%%%%%"<<endl;
for(int v=0;v<3;v++){
for(int i=0;i<9;i++){
   for(int j=0;j<9;j++){
     int num = check_Num(A[i][j],i);

      if(A[i][j]!=0&&num==2){

        // if(num==2){

         for(int k =0;k<3;k++){
           c[k] = check_Line(A[i][j],3*(i/3)+k);
           d[k] = check_Table(A[i][j],i,k);
         }

      for(int k=0;k<3;k++){
         //cout<<c[k]<<" "<<d[k]<<endl;

         if(c[k]<0)
         row = 3*(i/3)+k;
         if(d[k]<0)
         column = k;
      }

    for(int b = 3*column;b<3*column+3;b++){
        int bool_value = check_Column(A[i][j],b);
        int zero_num= check_which_table_line(A[i][j],row, column);
         if(A[row][b]==0&&bool_value<0&&zero_num==1){
            A[row][b] = A[i][j];
         }
    }
         }


      }
}

for(int i=0;i<9;i++){
   for(int j=0;j<9;j++){
      int num_same= check_column_samenum(A[i][j],j);

   if(A[i][j]!=0&&num_same==2){


           for(int k = 0;k<3;k++){
             e[k] = check_column_table(A[i][j],k,j);
             f[k]= check_Column(A[i][j],(3*(j/3))+k);
        }

        for(int k=0;k<3;k++){
           if(e[k]<0)
             rowc =k;
             if(f[k]<0)
             columnc=3*(j/3)+k;
        }
        for(int h= 3*rowc;h<3+3*rowc;h++){
           int bool_value = check_Line(A[i][j],h);
           int zero_col_num = check_which_table_column(A[i][j],rowc,columnc);

           if(A[h][columnc]==0&&bool_value<0&&zero_col_num==1){
              A[h][columnc]=A[i][j];
           }

      }
        }
        }
}


   }
// the method of only one

for(int t=0;t<3;t++){
for(int w=0;w<9;w++){
   check_only_line(w);

}
for(int w=0;w<9;w++){
   check_only_col(w);
}
for(int s=0;s<3;s++){
   for(int d=0;d<3;d++){
      check_nine_table(s,d);
   }
}
}
//the methond of only two

for(int t=0;t<3;t++){
for(int i=0;i<9;i++){
    for(int j=0;j<9;j++){
        if(A[i][j]==0){
     check_only_two(i,j);
        }
    }
}
   }

  for(int i=0;i<9;i++){

   for(int j=0;j<9;j++){
      NO++;
      if(NO%9==1)
      cout<<endl;
      cout<<setw(2)<<A[i][j]<<" ";

   }
    cout<<" "<<endl;
  }
}

// do judgement to check wehcher the array is right


return 0;
}

//check firse three table ,the same number is >2

int check_Num(int t,int x){
    int counter=0;
    int r = x/3;
    for(int m=3*r;m<3*r+3;m++){
       for(int n=0;n<9;n++){
          if(A[m][n]==t){
             counter++;
          }
       }
    }
    //cout<<t<<" "<<counter<<" "<<r<<endl;

    return counter;
 }
 //check whick line deesn't have corruent number

 int check_Line(int t,int m){
    //if(t==0)

    //return 0;

   for(int n =0;n<9;n++){
      if(A[m][n]==t){
    //cout<<"found "<<t<<" "<<endl;

          return 1;
      }
       }


   // cout<<"no same "<< t<<" "<<endl;

    return -1;

 }
//check which table have the corruent number

 int check_Table(int t,int m,int n){
     int r = m/3;
      for(int p = 3*r;p<3*r+3;p++){
          for(int q =3*n;q<3+3*n;q++){
            if(A[p][q]==t){
              // cout<<"9gongge "<<t<<" "<<p<<" "<<q<<endl;

               return 1;
            }}
         }
      //cout<<"9gongge,not found "<<t<<" "<< r<<endl;

      return -1;
 }
 //check the corruent col have same number

 int check_Column(int t,int m){
    for(int i =0;i<9;i++){
       if(A[i][m]== t){
          //cout<<"found column "<<t<<" "<<m<<" "<<i<<endl;

          return 1;
       }
    }
    //cout<<"not found "<<t<<" "<<m<<endl;

    return -1;
 }
int check_EachLine_Num(int t,int r,int c){
      int zero_number=0;
         for(int p=3*c;p<3*c+3;p++){
            if(A[r][p]==0){
             zero_number++;
             //cout<< "before "<< t<<" "<<zero_number<<endl;

            }
         for(int q=0;q<9;q++){
             if(A[q][p]==t)
             zero_number--;
         }
         }
        // cout<<"after"<< t<<" "<<zero_number<<endl;

         return zero_number;

}

 

»¹ÓУº

 

int check_column_table(int t,int m,int n){
   int col= n/3;
   for(int p=3*m;p<3*m+3;p++){
   for(int q= 3*col;q<3*col+3;q++){

         if(A[p][q]==t){
           // cout<<t<<" "<<p<<" "<<q<<endl;

            return 1;
         }}
   }
         //cout<<"no found"<<t<<" "<<col<<endl;

   return -1;

}


int check_column_num_zero(int r,int l){
    int num_col_zero =0;
    for(int m = 3*r;m<3*r+3;m++){
       if(A[m][l]==0){
          num_col_zero++;
       }
    }
    //cout<<"number_zero "<<num_col_zero<<endl;

    return num_col_zero;
}
int check_column_samenum(int t,int r){
    int c = r/3;
    int col_same_num=0;
   for(int i =0;i<9;i++){
      for(int j=3*c;j<3+3*c;j++){
         if(A[i][j]==t){
            col_same_num++;
         }}}
      //cout<<"same num "<<t<<" "<<col_same_num<<endl;

         return col_same_num;
}


int check_which_table_line(int t,int r,int c){
   int counter_zero =0;
   for(int p = 3*c;p<3+3*c;p++){
      if(A[r][p]==0){
         counter_zero++;

       for(int q=0;q<9;q++){
          if(A[q][p]==t)
          counter_zero--;
       }}}
       return counter_zero;
       }
int check_which_table_column(int t,int r,int c){
   int counter_zero=0;
    for(int p =3*r;p<3+3*r;p++){
       if(A[p][c]==0){
          counter_zero++;
          for(int q=0;q<9;q++){
             if(A[p][q]==t)
             counter_zero--;
          }}}
          return counter_zero;
}
void check_only_line(int p){
       int sum=45;
       int counter=0;
   for(int q=0;q<9;q++){
        if(A[p][q]==0){
           counter++;
        }}

        for(int k=0;k<9;k++){
        if(counter==1&&A[p][k]!=0)
         sum= sum-A[p][k];
        }

        for(int m=0;m<9;m++){
          if(A[p][m]==0&&counter==1)
          A[p][m]= sum;
       }
       }


void check_only_col(int q){
   int sum=45;int counter=0;
   for(int p=0;p<9;p++){
      if(A[p][q]==0){
         counter++;
      }}
      for(int k=0;k<9;k++){
         if(counter==1&&A[k][q]!=0)
            sum=sum-A[k][q];
      }

         for(int m=0;m<9;m++){
            if(A[m][q]==0&&counter==1)
               A[m][q]=sum;
            }
      }
void check_nine_table(int m,int n){
   int sum=45;int counter=0;
   for(int p=3*m;p<3*m+3;p++){
      for(int q=3*n;q<3*n+3;q++){
         if(A[p][q]==0)
         counter++;}
   }

         for(int j=3*m;j<3*m+3;j++){
      for(int k=3*n;k<3*n+3;k++){
         if(A[j][k]!=0&&counter==1)
          sum= sum-A[j][k];
      }
         }

      for(int p=3*m;p<3*m+3;p++){
      for(int q=3*n;q<3*n+3;q++){
         if(A[p][q]==0&&counter==1)
         A[p][q]=sum;
      }}

}

void check_only_two(int i,int j){
//cout<<i<<" "<<j<<endl;

    int x=i/3,y=j/3;
    int bool_row=0,bool_col=0,bool_table=0;
    int row_zero_num=0,col_zero_num=0,table_zero_num=0;

    //check num of zero in col

    for(int m=0;m<9;m++){
        if(A[m][j]==0)
            col_zero_num++;

        }
        //cout<<"number of zero in COL "<<j<<" "<<col_zero_num<<endl;

        //check num of zero in row

        for(int m=0;m<9;m++){
        if(A[i][m]==0)
            row_zero_num++;

        }
         //cout<<"number of zero in ROW "<<i<<" "<<row_zero_num<<endl;

     //check num of zero of table

     for(int p=3*x;p<3*x+3;p++){
         for(int q=3*y;q<3+3*y;q++){
             if(A[p][q]==0){
             table_zero_num++;
              //cout<<"number of zero in TABLE "<<x<<" "<<y<<" "<<table_zero_num<<endl;

             //cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;

         }}
     }

   // cout<<i<<" "<<j<<" "<<row_zero_num<<col_zero_num<<table_zero_num<<endl;

     if(((0<col_zero_num&& col_zero_num<=2)||(0<row_zero_num&&row_zero_num<=2))||(0<table_zero_num&&table_zero_num<=2)){
         //check if row has the same


         for(int k=1;k<10;k++){
             bool_row = check_Line(k,i);

        //check if col has the same

        bool_col = check_Column(k,j);

    // check if table has the same

      bool_table= checkSame_two_table(k,x,y);


    if(bool_row==-1&&bool_col==-1&&bool_table==-1){
        A[i][j]=k;
    }
         }
     }
}

int checkSame_two_table(int t,int x,int y){
        for(int c=3*x;c<3+3*x;c++){
        for(int d=3*y;d<3+3*y;d++){
            if(A[c][d]==t){
               return 1;
            }}}
            return -1;
}

 

Óеã·è¿ñ£¬ÏÖÔÚÏëÆðÀ´£¬×Ô¼ºÌ«³å¶¯£¬µ±Ê±¾ÍÒ»Ö±Ïë°ÑËüд³öÀ´£¬ÍêÈ«°´ÕÕ×Ô¼ºµÄ·½·¨¡£ºóÀ´²Å·¢Ïֵݹ鷽·¨¸ü¼ò±ã£¬¸üÓÐЧ¡£

Õâ¸ö³ÌÐòÄÜ´¦ÀíµÄÎÊÌâµÄÄÜÁ¦±È¿ªÊ¼µÄÌá¸ßÁ˲»ÉÙ¡£

½á¹ûÊÇ£º

%%%%%%%%%%%%

 1  4  6  8  3  7  9  5  2

 5  7  9  2  4  1  8  3  6

 2  3  8  5  7  9  1  6  4

 7  2  4  3  6  8  5  9  1

 6  8  3  9  1  5  4  2  7

 9  5  1  4  7  2  3  8  6

 3  6  2  7  9  4  8  1  5

 4  1  5  6  8  3  2  7  9

 8  9  7  1  5  2  6  4  3
Çë°´ÈÎÒâ¼ü¼ÌÐø. . .

 

ÖÁÓڵݹéµÄ·½·¨£¬ÄãÃÇÏÈ×Ô¼º¿¼ÂÇһϣ¬²»¼±£º¸ÄÌ칫²¼

ÔðÈα༭ webmaster