B3622 枚举子集(绝非正解)

更新日志:

2024.8.17 写下文章

2024.8.26 改进代码

---------------------------------------------------超级可爱的分割线---------------------------------------------------

正文

今天我快快乐乐的来到了luogu.com.cn,想刷刷DFS的题,但是我突然看到了这么一道题:题目传送门

嗯?这能用DFS?疑惑的我看了看题解。都是二进制枚举啊!问题是我不太能看懂二进制枚举,于是就气不打一处来,决定手写一个非常暴力的程序。

思路:把n的所有情况一一枚举出来,然后有几种情况写几个循环,这里用到一个常用技巧:宏定义,不懂得可以来这里看一下。(翻到最下面)

话不多说,先上代码(代码后面还有话的)

#include <iostream>
#define f(A) for (int A = 1; A <= 2; A++)
#define i(A) if (A == 2) cout << 'Y'; else cout << 'N';
#define q cout << endl;
using namespace std;
 

int main() {
	int n;
	cin >> n;
	if (n == 1) {
		f(i1) {
			i(i1)
			q
		}
	} else if (n == 2) {
		f(i1)
		f(i2) {
			i(i1)
			i(i2)
			q
		}
	} else if (n == 3) {
		f(i1)
		f(i2)
		f(i3) {
			i(i1)
			i(i2)
			i(i3)
			q
		}
	} else if (n == 4) {
		f(i1)
		f(i2)
		f(i3)
		f(i4) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			q
		}
	} else if (n == 5) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			q
		}
	} else if (n == 6) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			q
		}
	} else if (n == 7) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6)
		f(i7) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			i(i7)
			q
		}
	} else if (n == 8) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6)
		f(i7)
		f(i8) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			i(i7)
			i(i8)
			q
		}
	} else if (n == 9) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6)
		f(i7)
		f(i8)
		f(i9) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			i(i7)
			i(i8)
			i(i9)
			q
		}
	} else if (n == 10) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6)
		f(i7)
		f(i8)
		f(i9)
		f(i0) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			i(i7)
			i(i8)
			i(i9)
			i(i0)
			q
		}
	}
	return 0;
}

番外:

当我把这串代码交上去时,发现只有两个测试点。。。

我帮你们看到了,这两个点分别是n=1和n=10的情况。

所以如果你们要用这个方法,只需要这样的代码:

#include <iostream>
#define f(A) for (int A = 1; A <= 2; A++)
#define i(A) if (A == 2) cout << 'Y'; else cout << 'N';
#define q cout << endl;
using namespace std;
 

int main() {
	int n;
	cin >> n;
	if (n == 1) {
		f(i1) {
			i(i1)
			q
		}
	} else if (n == 10) {
		f(i1)
		f(i2)
		f(i3)
		f(i4)
		f(i5)
		f(i6)
		f(i7)
		f(i8)
		f(i9)
		f(i0) {
			i(i1)
			i(i2)
			i(i3)
			i(i4)
			i(i5)
			i(i6)
			i(i7)
			i(i8)
			i(i9)
			i(i0)
			q
		}
	}
	return 0;
}

END

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值