Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Phần mềm C++ | Chương trình giải Sodoku

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    66

    Talking Phần mềm C++ | Chương trình giải Sodoku

    Có vài bạn em cứ thích chơi trò này chứ em đâu chơi.
    Nhưng có người hỏi em nên em tò mò hỏi rõ luật chơi và em có ý tường viết chương trình để giải.
    Nói vui tí là chuyến này chẳng ai cho trò sodoky nữa vì em test bản demo thời gian giải chỉ mất < 45 ms thôi.
    Ý tưởng của em là đưa ra tất cả các trường hợp và kiểm tra xem nó có phù hợp không.
    Mọi người chờ em code xong bản chính thức bằng C++ nhé.

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    78

    Uh! rất hân hạnh.Loại này liên quan rất nhiều tới tính chất của matrix đó nhé.
    Bạn phải dùng thuật toán nào nhanh ơi là nhanh mới thú vị.Chứ quay lui vét cạn thì thôi . .

    >>Tiện thể hỏi:Bạn đo thời gian chạy chương trình = cách nào vậy?Phức tạp và chính xác ko?
    No way, No success..

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    7

    Cái này dễ mà , hơn nữa chương trình giải sodoku có từ lâu rùi mà trò này có sập đâu
    Cách đo thời gian chạy thì đầu chương trình mình lấy system time 1 phát , cuối chương trình lấy phát nữa rồi trừ đi nhau là xong mà

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Bạn xem bài này mình làm lâu quá rồi nên chưa để ý tới chuyện tối ưu:
    C++ Code:
    1. #include<iostream.h>
    2. #include<string.h>
    3. #include<conio.h>
    4. #include<stdio.h>
    5. #include<stdlib.h>
    6. int tamij[2][81],th=1,i,j,tang,so[81],a=0;
    7. char kt1[2]="c",kt[2]="c",A[9][9],so_khac[81][9],***B;
    8.  
    9. void wellcome();
    10. int ss_ngang(char a,int b);
    11. int ss_doc(char a, int b);
    12. int ss_o(char a, int b,int c);
    13. int kiem_tra();
    14. void nhap();
    15. void in();
    16. void dien_so();
    17. void tim_o_trong(int a);
    18. void tim_so_khac(int a, int b,int c);
    19. void so_co_the_dien(int a);
    20. void dien_tiep(int a);
    21.  
    22.  
    23. void main(){
    24.   while(kt[0]=='c'||kt[0]=='C'){
    25.    wellcome();
    26.    cin>>kt;
    27.    if(kt[0]=='c'||kt[0]=='C'){
    28.     // Nhap chuoi thich hop
    29.     nhap();
    30.     //dien nhung so thich hop
    31.     dien_so();
    32.     //kiem tra dung sai sau khi dien
    33.     if(kiem_tra()==1){
    34.     cout<<"\nCo duy nhat 1 dap an: ";
    35.     in();
    36.     getch();
    37.     };
    38.     if(kiem_tra()==0){
    39.       a=0;
    40.       // tao mang dong
    41.       B=new char** [81];
    42.       for(int q=0;q<81;q++)
    43.       B[q]=new char* [9];
    44.       for(int w=0;w<81;w++)
    45.      for( int r=0;r<9;r++)
    46.         B[w][r]=new char [9];
    47.       dien_tiep(a);
    48.     };
    49.    };
    50.  
    51.   };
    52.  
    53. };
    54.  
    55. void wellcome(){
    56.    clrscr();
    57.    cout<<"CHUONG TRINH GIAI TRO CHOI \"SUDOKU\"";
    58.    cout<<"\n\nBan nhap vao tung hang ngang voi o khong co so ban hay nhap dau cham";
    59.    cout<<"\n\nBan co muon giai o \"SUDOKU\" nao khong (c/k):";
    60. };
    61.  
    62. void nhap(){
    63.     int t=0;
    64.     char chuoi[10];
    65.     cout<<"\n\n\n";
    66.     for(int i=0;i<9;i++){
    67.        cout<<"nhap mot chuoi:";
    68.        gets(chuoi);
    69.  
    70.        for (int j=0;j<9;j++){
    71.       A[t][j]=chuoi[j];
    72.       chuoi[j]=' ';
    73.       };
    74.        chuoi[9]=' ';
    75.        t++;
    76.        };
    77. };
    78.  
    79. void in(){
    80.    cout<<"\n";
    81.    for (int i=0;i<9;i++)
    82.       for (int j=0;j<9;j++){
    83.      if(j==3||j==6)cout<<"  ";
    84.      cout<<A[i][j];
    85.      if (j==8) cout<<"\n";
    86.      if((i==2||i==5)&j==8)cout<<"\n";
    87.      };
    88. };
    89.  
    90. void dien_so(){
    91.  char tam,tam2,so[]="123456789";
    92.  int lap,khac=0;
    93.  
    94.  lap=1;
    95.  while (lap==1){
    96.    lap=0;
    97.    for (int i=0;i<9;i++)
    98.       for( int j=0;j<9;j++){
    99.      if (A[i][j]=='.'){
    100.         for (int k=0;k<9;k++){
    101.          tam=so[k];
    102.          if((ss_ngang(tam,i)==1)&&(ss_doc(tam,j)==1)&&(ss_o(tam,i,j)==1))
    103.             {
    104.             tam2=tam;
    105.             khac++;
    106.  
    107.             };
    108.  
    109.          };
    110.         if(khac==1){
    111.            A[i][j]=tam2;
    112.            lap=1;
    113.            };
    114.         };
    115.      tam=' ';tam2=' ';khac=0;
    116.      };
    117.       };
    118. };
    119.  
    120.  
    121. int ss_ngang(char a, int b){
    122.    int tam=1;
    123.    for (int i=0;i<9;i++)
    124.       if (a==A[b][i]) tam=0;
    125.    return tam;
    126. };
    127.  
    128. int ss_doc(char a,int b){
    129.    int tam=1;
    130.    for (int i=0;i<9;i++)
    131.       if (a==A[i][b]) tam=0;
    132.    return tam;
    133. };
    134.  
    135. int ss_o(char a, int b, int c){
    136.    int tam=1;
    137.    if (b<3&&c<3){
    138.       for (int i=0;i<3;i++)
    139.     for (int j=0;j<3;j++)
    140.        if (a==A[i][j]) tam=0;
    141.       };
    142.    if (b<3&&c>2&&c<6){
    143.       for (int i=0;i<3;i++)
    144.     for (int j=3;j<6;j++)
    145.        if (a==A[i][j]) tam=0;
    146.       };
    147.    if (b<3&&c>5&&c<9){
    148.       for (int i=0;i<3;i++)
    149.     for (int j=6;j<9;j++)
    150.        if (a==A[i][j]) tam=0;
    151.       };
    152.    if (b>2&&b<6&&c<3){
    153.       for (int i=3;i<6;i++)
    154.     for (int j=0;j<3;j++)
    155.        if (a==A[i][j]) tam=0;
    156.       };
    157.    if (b>2&&b<6&&c>2&&c<6){
    158.       for (int i=3;i<6;i++)
    159.     for (int j=3;j<6;j++)
    160.        if (a==A[i][j]) tam=0;
    161.       };
    162.    if (b>2&&b<6&&c>5&&c<9){
    163.       for (int i=3;i<6;i++)
    164.     for (int j=6;j<9;j++)
    165.        if (a==A[i][j]) tam=0;
    166.       };
    167.    if (b>5&&b<9&&c<3){
    168.       for (int i=6;i<9;i++)
    169.     for (int j=0;j<3;j++)
    170.        if (a==A[i][j]) tam=0;
    171.       };
    172.    if (b>5&&b<9&&c>2&&c<6){
    173.       for (int i=6;i<9;i++)
    174.     for (int j=3;j<6;j++)
    175.        if (a==A[i][j]) tam=0;
    176.       };
    177.    if (b>5&&b<9&&c>5&&c<9){
    178.       for (int i=6;i<9;i++)
    179.     for (int j=6;j<9;j++)
    180.        if (a==A[i][j]) tam=0;
    181.       };
    182.    return tam;
    183. };
    184.  
    185. int kiem_tra(){
    186.     char tam='.';
    187.     int kq=1;
    188.     for(int i=0;i<9;i++)
    189.        for (int j=0;j<9;j++)
    190.       if(tam==A[i][j]) kq=0;
    191.     return kq;
    192. };
    193.  
    194. void tim_o_trong(int a){
    195.     tang=0;
    196.     for (int i=0;i<9;i++)
    197.        for(int j=0;j<9;j++)
    198.        if (A[i][j]=='.')
    199.        {
    200.          tang++;
    201.          for(int e=0;e<2;e++)
    202.         for(int f=0;f<tang;f++){
    203.           if(e==0) tamij[0][a+tang-1]=i;
    204.           if(e==1) tamij[1][a+tang-1]=j;
    205.           };
    206.        };
    207.     for(int g=a+1;g<81;g++)
    208.        {
    209.     tamij[0][g]=0;
    210.     tamij[1][g]=0;
    211.        };
    212. };
    213.  
    214. void tim_so_khac( int a, int b,int c){
    215.     char so[]="123456789";
    216.     int cho_dien=0;
    217.     for(int i=0;i<9;i++)
    218.        so_khac[c][i]='0';
    219.     for (int k=0;k<9;k++){
    220.      if((ss_ngang(so[k],a)==1)&&(ss_doc(so[k],b)==1)&&(ss_o(so[k],a,b)==1))
    221.          {
    222.            cho_dien++;
    223.            so_khac[c][cho_dien-1]=so[k];
    224.          };
    225.      };
    226.  
    227. };
    228.  
    229. void so_co_the_dien(int a){
    230.     int tang1=0;
    231.     for(int i=0;i<9;i++){
    232.        if(so_khac[a][i]!='0') tang1++;
    233.        so[a]=tang1;
    234.        };
    235. };
    236.  
    237. void dien_tiep(int a){
    238.     for(int t=0;t<9;t++)
    239.       for(int u=0;u<9;u++)
    240.       B[a][t][u]=A[t][u];
    241.  
    242.    tim_o_trong(a);
    243.    tim_so_khac(tamij[0][a],tamij[1][a],a);
    244.    so_co_the_dien(a);
    245.    if(so[a]!=0&&(kt1[0]=='c'||kt1[0]=='C')){
    246.      for(int x=0;x<so[a];x++){
    247.  
    248.       for(int w=0; w<9;w++)
    249.      for(int r=0; r<9; r++)
    250.         A[w][r]=B[a][w][r];
    251.  
    252.       if(so_khac[a][x]!='0'&&(kt1[0]=='c'||kt1[0]=='C')){
    253.  
    254.      i=tamij[0][a];
    255.      j=tamij[1][a];
    256.      A[i][j]=so_khac[a][x];
    257.      dien_so();
    258.      if(kiem_tra()==1){
    259.         cout<<"\nTruong hop "<<th<<" la:\n";
    260.         th++;
    261.         in();
    262.         cout<<"\n\nBan co muon xem tiep truong hop khac khong (c/k):";
    263.         cin>>kt1;
    264.         };
    265.  
    266.      if(kiem_tra()==0){
    267.         dien_tiep(a+1);
    268.         };
    269.  
    270.       };
    271.      };
    272.  
    273.   };
    274.  
    275. };
    Không biết ghi gì luôn ...

  5. #5
    Ngày gia nhập
    03 2009
    Bài viết
    1

    có bác nào biết cách viết chương trình chuyển đổi từ so tự nhiên sang hệ nhị phân khong ?????????????????

  6. #6
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    Mặc định Phần mềm C++ | Chương trình giải Sodoku

    Mình viết trò này cách đây 3 năm dùng phương pháp try and error thấy cũng nhanh mà, cái nào cũng giải ra được chưa tới 1s. Còn không thì có thể dùng luật của sudoku . Hoặc dùng thuật toán Dancing Link là nhanh nhất, nhưng cài đặt khó.
    Đã được chỉnh sửa lần cuối bởi DKhanh : 09-04-2009 lúc 05:26 PM.

Các đề tài tương tự

  1. Giảm giá cực sốc lắp mạng giảm đến 50% tại Bình Tân, Bình Thạnh, Gò Vấp, Phú Nhuận, Tân Bình, Tân Phú...hcm
    Gửi bởi kennethmanhj trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 27-10-2013, 07:24 PM
  2. Sách nói về gải Sodoku
    Gửi bởi vtien_uit trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 1
    Bài viết cuối: 28-02-2008, 10:47 PM
  3. sodoku (Lưu ý: Tiêu đề không rõ ràng)
    Gửi bởi ath trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 18-01-2008, 12:11 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn