Điều kiện để không xảy ra trường hợp "_ _"

Đề của e cho ra thế này : nhập n và k trong đó n là số quả bóng tối đa ném được k là số quả bóng tối thiểu ném vào rổ, người chơi chiến thắng nếu không ném 2 lần liên tiếp không vào rỗ, tìm các cách để người chơi giành chiến thắng ( biểu diễn ném trúng là “x” không trúng là “_” ví dụ nhập n = 5; k=3 thì khi chiến thắng sẽ như này x _ x x _ hoặc x x x x _ thua sẽ như này x _ _ x x mấy bác help với giúp e cái điều kiện để k xảy ra _ _ với

#include <stdio.h>
#define max 100

int n,k;
int x[max];
int dem,dem1;
void nhap()
{
	printf ("Nhap n : ");
	scanf ("%d",&n);
	printf ("Nhap k : ");
	scanf ("%d",&k);
}
void xuatnghiem()
{
	dem=0;
	dem1=0;
	for (int i=1;i<=n;i++)
		{
			if (x[i]==1)
				dem++;
			else
				dem1++;
		}
	if (dem>=k)
		{
			
			for (int i=1;i<=n;i++)
				if (x[i]==1)
					printf ("x");
				else
					printf ("_");
			printf ("\n");
		}
}
void bongro(int i)
{
	for (int j=0;j<=1;j++)
		{
			x[i]=j;
			if (i==n)
				xuatnghiem();
			else 
				bongro(i+1);
		}
}
int main()
{
	nhap();
	bongro(1);
}

Mình chưa đọc code của bạn nhưng mà theo mình điều kiện đầu tiên để không xảy ra __k >= n/2.

1 Like

Trong hàm xuatnghiem() của bạn thì bạn kiểm tra luôn có thắng hay không rồi mới xuất.
Mà điều kiện để thắng thì như bạn nói rồi. Vậy chỉ cần kiểm tra x[i] != 0x[i + 1] != 0.

Hay nói cách khác nếu x[i] = 0x[i + 1] = 0 thì sẽ thua. Nên bạn chỉ cần thêm đoạn code kiểm tra điều kiện trên vào vòng for đầu tiên của hàm xuatnghiem().

Với lại diem1 của bạn mình thấy không dùng đến thì có thể bỏ đi.

Sửa lại hàm xuatnghiem() thành thế này: :point_down:

void xuatnghiem() {
	dem = 0;
	for (int i = 1; i <= n; i++) {
		if (x[i] == 0 && x[i + 1] == 0 && i < n)
			return;
		if (x[i] == 1)
			dem++;
	}
	if (dem >= k) {
		for (int i = 1; i <= n; i++)
			if (x[i] == 1)
				printf ("x");
			else
				printf ("_");
		printf ("\n");
	}
}
2 Likes

thanks bác nhé <3, nhưng vẫn còn sạn để e fix tiếp xem sao ^^

cảm ơn bác nhiều nhé e fix được rồi <3 :

#include <stdio.h>
#define max 100
int n,k;
int x[max];
int dem;
void nhap()
{
	printf ("Nhap n : ");
	scanf ("%d",&n);
	printf ("Nhap k : ");
	scanf ("%d",&k);
}
void xuatnghiem()
{
	dem=0;
	for (int i=1;i<=n;i++)
		{
			if (x[i]==1)
				dem++;
			else if (x[i]==0 && x[i+1]==0 && i<=n)
					{
						dem=0;
						break;
					}
		}
	if (dem>=k)
		{
			for (int i=1;i<=n;i++)
				if (x[i]==1)
					printf ("x");
				else 
					printf ("_");
			printf ("\n");
		}
}
void bongro(int i)
{
	for (int j=0;j<=1;j++)
		{
			x[i]=j;
			if (i==n)
				xuatnghiem();
			else 
				bongro(i+1);
		}
}
int main()
{
	nhap();
	bongro(1);
}

Bạn ơi, bạn đọc topic này để biết cách post source code sao cho đẹp nha. :slight_smile:


Edit: Code của mình sửa lại là ổn r nha. Điều kiện sai là nó return luôn chứ không phải là break như bạn.

  • return thoát luôn hàm xuatnghiem() ngay sau khi điều kiện sai.

  • break chỉ thoát khỏi vòng for song lại mất công xuống if kiểm tra xem diem >= k mặc dù biết kiều kiện luôn sai thì kiểm tra để làm gì. Thà rằng bạn cứ thoát luôn khi biết là trường hợp đó không thắng có phải nhanh hơn không. :sweat_smile:

3 Likes

à ra v :v có thêm kiến thức mới :V

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