bài toán con Hậu sai ở đâu nhỉ .... :)

#include <iostream>
#include <string>
using namespace std;
int kq[8];
int cot[8];
int cheo_chinh[15];
int cheo_phu[15];
void xep_hau(int k)
{
	//memset(kq,0,sizeof(kq));
	memset(cot,0,sizeof(cot));
	memset(cheo_chinh,0,sizeof(cheo_chinh));
	memset(cheo_phu,0,sizeof(cheo_phu));
	for (int i = 0;i<8;i++)
	{
		for (int j = 0;j<8;j++)
		{
			if(cot[i] == 0 && cheo_chinh[i+j] == 0 && cheo_phu[i-j+7] == 0)
			{
				kq[k] = i;
				cot[i] == 1; 
				cheo_chinh[i+j] = 1; 
				cheo_phu[i-j+7] = 1;
			}
		}
	}
	if(k == 7) for(int i = 0;i<8;i++)
	{
		cout << endl;
		cout << kq[i];
	}
	else xep_hau(k+1);
}
int main()
{
	xep_hau(0);
	system("pause");
	return 0;
}

Mình dùng dev C++.
11 26 C:\Users\LocDC\Desktop\z.cpp [Error] ‘memset’ was not declared in this scope.

1 Like

Nếu bạn có làm thư viên “memset.h” thì bạn chưa #include. Còn nếu bạn không định nghĩa thư viện thì phải có hàm này, còn thuật toán thì mình k biết :)))))

void* memset( void* buffer, int ch, size_t count )
{
char *p = (char *)buffer;
for(int i=0; i < count; i++)
p[i] = (char) ch;

return buffer;
}
1 Like

mình dùng visual stdio 2010 có đầy đủ thư viện trong iostream rùi cậu ạ

1 Like

Vậy thì chắc thuật toán :smiley:

1 Like

Tại sao bạn in ra như vậy? Giải thích hộ mình với :blush:

1 Like

bài toán xếp hậu này bạn có thể đọc trong cuốn cấu trúc dữ liệu giải thuật của lê Minh Hoàng. bài này là một trong những bài kinh điển của thuật toán quay lui

2 Likes

đọc rùi nắm dc giải thuật rồi có điều trong quá trình code có chỗ code sai thôi … nên mới hỏi xem có ai nhìn ra giúp với :slight_smile:

1 Like
#include<iostream>
#include<cstdio>
#include<string.h>
int n;
int X[9];
bool A[8],B[16],C[16];
using namespace std;
void Display()
{
    for(int i=1;i<=n;i++)
        cout << "("<<i<<","<<X[i] <<") ";
        cout <<"\n";
}
int Try(int i)
{
    for(int j=1;j<=n;j++)
    {
        if(A[j]&&B[i+j-1]&&C[j-i+8])
        {
        X[i]=j;
       if(i==n)
       {
            Display();

       }
        else
       {
            A[j]=0;
            B[i+j-1]= 0;
           C[j-i+8]=0;
           Try(i+1);
        A[j]=1;
        B[i+j-1]= 1;
        C[j-i+8]=1;
     }
        }
}
}
int main()
{
   // freopen("QUEENS.INP","r",stdin);
   // freopen("QUEENS.OUT","w",stdout);
    cin >> n;
   memset(A,1,9);
   memset(B,1,16);
    memset(C,1,16);
    Try(1);
    return 0;
}

Mình sửa lại format code giúp bạn nhé. Bạn xem bài viết này để sử dụng markdown trên diễn đàn

2 Likes

Mình chưa đọc toàn bộ code nhưng phần in kết quả như thế có nghĩa kq[i] là tung độ của hàng thứ i. Nếu
k == 7 nghĩa là bàn cờ 8 ô, dùng mảng thì có chỉ số từ 0 -> 7. Khi chạy đến hàng thứ 7 nghĩa là tất cả các hàng trước đó đã tim ra tung độ phù hợp => in ra thôi smiley

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?