Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 16
  1. #1
    Ngày tham gia
    Sep 2015
    Đang ở
    89 Tam Trinh - Hoàng Mai - Hà Nội
    Bài viết
    0

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    anh có thể comment vào các hàm trong bài được ko ạ

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    em cảm ơn anh nhiều, nhưng anh có thề viết cho em hàm sinh số ngẫu nhiên được ko ạ

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Sodoku có thể dùng thuật toán Backtracking để duyệt qua tất cả các trường hợp có thể để giải ô số (cũng có thể dùng để phát sinh ô số bằng cách giải 1 ô số sau đó xóa dần random đến khi xóa tiếp thì sinh ra >1 cách giải thì lấy ô số trước đó)

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Lần trước Hồi học môn Trí Tuệ Nhân Tạo, có bạn cũng làm đề tài này. Bị mình chém cho tơi bời ở các vấn đề sau:
    1. Phát sinh Sodoku cấp n (Bạn dùng thuật toán phát sinh hay là Nạp Sodoku có sẵn)
    2. Giải Soduku(Bạn sử dụng thuật toán gì hay lại load bản giải có sẵn tương ứng với từng Sodoku).

  6. #6
    bạn có thể nói rõ hơn được ko? ví dụ đi

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nhà mất mạng giờ đang phải ngồi quán :-S... khi nào có net tớ post code lên đây [IMG]images/smilies/smile.png[/IMG]

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    void dienso(){    int dem=0,lap=1;    int tep,s,so1[9];    for (int r=0;r<9;r++) so1[r]=r+1;    while (lap==1)    {        lap=0;        for (int i=1 ;i<=9;i++)        for (int j=1 ;j<=9;j++)        if (A[i][j]==0)         {            for (int k=0;k<9;k++)             {                tep=so1[k];                if (quetngang(tep,i,j)&&quetdoc(tep,i,j)&&queto(tep,i,j))                 {                  ++dem;                  s=tep;                }            }            if (dem==1)             {                A[i][j]=s;                lap=1;            }        dem=0;s=0;        }    }}void cacsocothedien(int x,int y,int z){    int so1[9];    for (int r=0;r<9;r++) so1[r]=r+1;    int j=0;    for (int h=0;h<9;h++) sokhac[z][h]=0;    for (int k=0;k<9;k++)    if (quetngang(so1[k],x,y)&&quetdoc(so1[k],x,y)&&queto(so1[k],x,y))    {        sokhac[z][j]=so1[k];        j++;    }}void cacsokhac(int a){    int temp=0;    for (int i=0;i<9;i++)     if (sokhac[a][i]!=0) temp++;    so[a]=temp;}  void xuatdulieu(){    int de=1;    for (int i=1;i<=9;i++)    {        for (int j=1;j<=9;j++) D[de++]=A[i][j];    } }void tim(int m){       int k,h;     for (k=1;k<=9;k++)    for (h=1;h<=9;h++)    if (A[k][h]==0)     {           t[0][m]=k;t[1][m]=h;return;    }} int kiemtra(){    for (int i=1;i<=9;i++)    for (int j=1;j<=9;j++)    if (A[i][j]==0) return 0;    return 1;}void xuly(int i){        for (int m=1;m<=9;m++)    for (int n=1;n<=9;n++) B[i][m][n]=A[m][n];    tim(i);    cacsocothedien(t[0][i],t[1][i],i);    cacsokhac(i);     if (so[i]!=0)    for (int l=0;l<so[i];l++)    {        if (ktra==1) return;        for (int m1=1;m1<=9;m1++)        for (int m2=1;m2<=9;m2++) A[m1][m2]=B[i][m1][m2];        if (sokhac[i][l]!=0)        {        c1=t[0][i];c2=t[1][i];                A[c1][c2]=sokhac[i][l];        dienso();        if (kiemtra()==1)         {           xuatdulieu();ktra=1;        }        if (kiemtra()==0)  xuly(i+1);        }    }               }
    bạn nào có thể giải thích cho minh biết những hàm trên trong bài giải sudoku dùng để làm j được ko ạ, nếu comment vào từng dòng thì càng tốt

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    uh, minh cam on bạn, khi nào được thì bạn cop len cho minh nha

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi Học Hỏi
    Sodoku có thể dùng thuật toán Backtracking để duyệt qua tất cả các trường hợp có thể để giải ô số (cũng có thể dùng để phát sinh ô số bằng cách giải 1 ô số sau đó xóa dần random đến khi xóa tiếp thì sinh ra >1 cách giải thì lấy ô số trước đó)
    1. Backtracking chỉ là một kỹ thuật, dùng truy ngược. Sodoku cấp 9 là chịu. Vì bản chất Backtracking là quay lui đệ quy. Xét bao nhiêu trường hợp đây tự tính.
    2. Giả sử người ta cần xây dựng Sodoku cấp 20 chẳng hạn. Nếu dùng cách 2 xóa đi lấy đâu Sodoku cấp 20 ban đầu mà xóa @@.

    Ta luôn sinh được 1 Sodoku cấp n với công thức xác định như sau.

    S[i,j]=k;
    k=(i+j-1)%(n+1);
    if (k==0) k++

    Soduku sinh ra có dạng:
    1 2 3 ... n
    n 1 2 ... n-1
    n-1 n 1 ... n-2
    ....
    n n-1 n-2 ... 1

    Với chữ số từ 1->n.
    Chỉ số hàng,cột tính từ 1.

    Ví dụ :
    Ví trí hàng 5 cột 3 trong Sodoku cấp 6 cơ bản trên là
    k=(5+3-1)%(6+1)=0
    vì k=0 nên k=k+1=0+1=1.
    Vậy S[5,3]=1.

    Không tin thì các bạn có thể thử nghiệm với cấp bất kỳ.

    Từ đó có thể hoán vị các hàng ,cột để sinh ra các Sodoku khác.

    Còn giải Sodoku thì theo tư tưởng nêu trên.

    Xin lỗi vì công thức sinh Sodoku ở trên của mình bị sai.
    Dưới đây là mã chương trình và công thức mình đã chỉnh lại phát sinh Sodoku cơ bản, từ đó sinh ra Sodoku ngẫu nhiên.
    Mã đã kiểm tra trên VC++ 2008


    Mã:
    #include <iostream>#include <iomanip>#include <ctime>#include <cstdlib>#include <cstdio>#include <conio.h> using namespace std;#define MAX 20 //Creating a base Sododu with rankvoid CreateBaseSodoku(int rank,int **&Sodoku){    //Alloc Memory for Sodoku    Sodoku=new int*[rank];    for (int i=0;i<rank;i++)    {        Sodoku[i]=new int[rank];        for (int j=0;j<rank;j++)            //This is the formula to determining the value o cell at row i,column j             //on Sodoku            Sodoku[i][j]=(i+j)%rank+1;    }} //Show up Sodokuvoid Show(int rank,int **Sodoku){    if (Sodoku==NULL)    {        cout<<"Error, Sodoku wasn't initialized properly
    ";        return;    }    for (int i=0;i<rank;i++)    {        for (int j=0;j<rank;j++)            cout<<setw(3)<<Sodoku[i][j];        cout<<endl;    }} //Generate randome Sodoku base on basice Sodoku//Input is based Sodokuvoid RandomSodoku(int rank,int **&Sodoku){ srand((unsigned)time(NULL)); int row1=rand()%rank; int row2=rand()%rank; int col1=rand()%rank; int col2=rand()%rank; //Swapping row1 with row2 for (int i=0;i<rank;i++) {     swap(Sodoku[row1][i],Sodoku[row2][i]); } //Swapping col1 with col2 for (int i=0;i<rank;i++) {     swap(Sodoku[i][col1],Sodoku[i][col2]); }} void main(){    int **Sodoku=NULL;    int rank=0;    cout<<"Enter rank of sodoku = ";    cin>>rank;    cout<<"Base Sodoku
    ";    CreateBaseSodoku(rank,Sodoku);    Show(rank,Sodoku);    while (getch()!=27)    {     cout<<"Randome Sodoku  (Press Esc to quit) 
    ";     RandomSodoku(rank,Sodoku);     Show(rank,Sodoku);    }    system("pause"); }

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •