30/09/2018, 18:04

bài toán sudoku và mở rộng?

e đang code bài toán sudoku,thuật toán thì đúng nhưng sao vẫn lỗi?ai giúp với,…đặc biệt cho in ra ngoài thì nên in ra kiểu j ?html?
mở rộng: liệu có thể làm đc tổng quát bài sudoku vs đã điền sẵn 1 vài ô?
e đã sửa lại code ,ghi chú rõ các hàm,…mong mọi người xem giúp

#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int v,i,j,h,k,h1,h2,h3,k1,k2,k3;
int x[100][100];
int print() //hàm the hien in ra ket qua khi da viet du 81 so tren bang suodku
{
    cout<<"??????"; // mong được viết hộ hàm in ra kiểu html hiện kết quả là bảng 9x9
}
int check(v,i,j) //ham kiem tra xem dieu kien tren bang sudoku
{
    for(k=0;k<=i;k++) //dieu kien khac nhau theo cot
    {
        if(x[k][j]==v) return 0;
    }
    for(h=0;h<=j;h++) //dieu kien khac nhau theo cot
    {
        if(x[i][h]==v) return 0;
    }
    h1=i/3; h2=i-3*h1;
    k1=j/3; k2=j-3*k1;
    for(h3=0;h3 <=2;h3++) // điều kiện để 2 ô thuộc cùng khoảng 9 ô con khác nhau?ai chơi sudoku sẽ hiểu
{
    for(k3=0;k3<=2;k3++)
    {
     if((h3<h2)||((h3==h2)&&(k3<k2)))
     {
         if(x[h1*3+h3,k1*3+k3]==v)
            return 0;
         else return 1;
     }
    }
    }return 1;
}

int TRY(i,j) // hàm đệ qui quay lui
{

    for(v=1;v<=9;v++)
    {
        if(check(v,i,j))
        {
            x[i][j]=v;
            if(i=8&&j=8) print();
            else {
                if(j<8) TRY(i,j+1);
                else TRY(i+1,1);
            }
        }
    }

}

int main()
{
    int n;
    cout << "nhap vao gia tri n="; cin>>n;
TRY(0,0);
    return 0;
}
Nguyễn Duy Khánh viết 20:15 ngày 30/09/2018

Xem qua đoạn code giống như bạn chuyển từ 1 ngôn ngữ khác sang C++ mà chưa hoàn chỉnh vậy.

Minh Hoàng viết 20:12 ngày 30/09/2018

Lỗi gì vậy bạn?

cho in ra ngoài thì nên in ra kiểu j

In ra ở đâu bạn nhỉ?

mở rộng: liệu có thể làm đc tổng quát bài sudoku vs đã điền sẵn 1 vài ô?

Được chứ, Chỉ cần bỏ qua các ô đã điền sẵn là được.

leogem viết 20:18 ngày 30/09/2018

mình chạy thì nó báo lỗi ở hàm check?mà k hiểu sao ở đâu?
ý mình là liệu có thể hiện bảng 9x9 ở đáp án cho bài trên đc k?

leogem viết 20:19 ngày 30/09/2018

t thấy nó hoàn chỉnh về thuật toán kiểm tra,xếp các số mà …chỉ là không biết lỗi ở đâu?làm thế nào để in kết quả ra 1 bảng ?
chuyển từ j sang?

Itachi Citus viết 20:15 ngày 30/09/2018

Khi đem code đi hỏi bạn nên chịu khó chú thích một xíu, chứ nhìn vô là tụi mình không dám đọc rồi, tên biến đặt cũng không rõ ràng v i j h k, vòng lặp cũng lồng nhau mà indent không rõ ràng, không rõ Try là try gì, Check là check gì. Thường thì những code này chỉ có bạn mới có khả năng debug nổi thôi.

Xem qua đoạn code giống như bạn chuyển từ 1 ngôn ngữ khác sang C++ mà chưa hoàn chỉnh vậy.

Giống như bạn này nói vậy á, không biết bạn lấy code từ đâu, vừa giống python vừa giống… pascal.

for(h3=0;h3 <=2;h3++)
{
    for(k3=0;k3<=2;k3++)
    {
     if((h3<h2)||((h3==h2)&&(k3<k2)))
     {
         if(x[h1*3+h3,k1*3+k3]==v)
            return 0;
         else return 1;
     }
    }
}else return 1;

C++ không có for else nha bạn.

leogem viết 20:12 ngày 30/09/2018

C++ không có for else nha bạn.

mình nhầm,đã sửa…viết rõ các hàm rồi còn bài này mình tự viết từ thuật toán trên giấy ra c++ luôn…đảm bảo không có fake hay từ ngôn ngữ nào ra chưa cả hiểu rõ python :3

Itachi Citus viết 20:06 ngày 30/09/2018

x[h13+h3,k13+k3]

Cái này là của… C# thì phải.

Cái hàm check của bạn bị sai logic ở cả ba điều kiện dọc, ngang, trong ô, theo mình thấy là vậy, cú pháp thì sai ở cái trên mình vừa nói.

if(j<8) TRY(i,j+1);
else TRY(i+1,1);

TRY (i+1, 0)

Itachi Citus viết 20:14 ngày 30/09/2018

if(i=8&&j=8)

Một mẹo nhỏ để tránh lỗi này, thường khó phát hiện là

if(8 == i && 8 == j)

để hằng số ra trước biểu thức điều kiện chứ không để biến ở trước, lỡ có gõ sai như của bạn

if(8 = i && 8 = j)

thì compiler nó sẽ réo lên.

leogem viết 20:07 ngày 30/09/2018

Cái hàm check của bạn bị sai logic ở cả ba điều kiện dọc, ngang, trong ô, theo mình thấy là vậy, cú pháp thì sai ở cái trên mình vừa nói.

vậy theo bạn logic phải như thế nào? mình thấy dựa theo toán thì đúng mà?
cú pháp kia sai?sửa hộ mik luôn vs x[h13+h3,k13+k3]
dùng code blocks cảm giác nó k đánh dấu (gạch chân) dưới chỗ làm sai…hơi khó tìm
nếu tiện,bạn có thể sửa hẳn lại code trên cho đúng hộ đc k?

leogem viết 20:14 ngày 30/09/2018

http://www.cplusplus.com/forum/beginner/76616/
mới lên mạng tìm link xem lời giải bài này …có lẽ phải học cái cách viết code của họ

thanks all…

Bài liên quan
0