打卡Day3 枚举 拨钟问题

原题链接

想了很久思路不是很清晰,看了别人的题解才发现呃呃我真的是太蠢了,没想清楚枚举的主要原因是没想到一个钟波动4次就想当与没拨,因此一个选项最多出现四次。

大佬的题解

可以是九层循环枚举代码如下

#include<iostream>
using namespace std;
int p[10], t[10];
int main()
{
	for (int i = 1; i <= 9; i++) {
		cin >> p[i];
	}
	int sum;
	for (t[1] = 0; t[1] < 4; t[1]++) {
		for (t[2] = 0; t[2] < 4; t[2]++) {
			for (t[3] = 0; t[3] < 4; t[3]++) {
				for (t[4] = 0; t[4] < 4; t[4]++) {
					for (t[5] = 0; t[5] < 4; t[5]++) {
						for (t[6] = 0; t[6] < 4; t[6]++) {
							for (t[7] = 0; t[7] < 4; t[7]++) {
								for (t[8] = 0; t[8] < 4; t[8]++) {
									for (t[9] = 0; t[9] < 4; t[9]++) {
										sum = 0;
										sum += (p[1] + t[1] + t[2] + t[4]) % 4;
										sum += (p[2] + t[1] + t[2] + t[3] + t[5]) % 4;
										sum += (p[3] + t[2] + t[3] + t[6]) % 4;
										sum += (p[4] + t[1] + t[4] + t[5] + t[7]) % 4;
										sum += (p[5] + t[1] + t[3] + t[5] + t[7] + t[9]) % 4;
										sum += (p[6] + t[3] + t[5] + t[6] + t[9]) % 4;
										sum += (p[7] + t[4] + t[7] + t[8]) % 4;
										sum += (p[8] + t[5] + t[7] + t[8] + t[9]) % 4;
										sum += (p[9] + t[6] + t[8] + t[9]) % 4;
										if (sum == 0) {
											for (int j = 1; j <= 9; j++) {
												while (t[j]--) {
													cout << j << " ";
												}
												
											}
											return 0;
										}
									}

								}
							}

						}

					}
				}
			}
		}
	}
}

看着很麻烦对吧实际上还能优化因为后面受前三个的影响所以代码可以如下

#include<iostream>
using namespace std;
int p[10], t[10];
int main()
{
    int sum;
    for (int i = 1; i <= 9; i++)
        cin >> p[i];
    for (t[1] = 0; t[1] < 4; t[1]++)
        for (t[2] = 0; t[2] < 4; t[2]++)
            for (t[3] = 0; t[3] < 4; t[3]++)
            {
                sum = 0;
                t[4] = (4 - (p[1] + t[1] + t[2]) % 4) % 4;
                t[5] = (4 - (p[2] + t[1] + t[2] + t[3]) % 4) % 4;
                t[6] = (4 - (p[3] + t[2] + t[3]) % 4) % 4;
                t[7] = (4 - (p[4] + t[1] + t[4] + t[5]) % 4) % 4;
                t[9] = (4 - (p[6] + t[3] + t[5] + t[6]) % 4) % 4;
                t[8] = (4 - (p[8] + t[5] + t[7] + t[9]) % 4) % 4;
                sum += (p[1] + t[1] + t[2] + t[4]) % 4;
                sum += (p[2] + t[1] + t[2] + t[3] + t[5]) % 4;
                sum += (p[3] + t[2] + t[3] + t[6]) % 4;
                sum += (p[4] + t[1] + t[4] + t[5] + t[7]) % 4;
                sum += (p[5] + t[1] + t[3] + t[5] + t[7] + t[9]) % 4;
                sum += (p[6] + t[3] + t[5] + t[6] + t[9]) % 4;
                sum += (p[7] + t[4] + t[7] + t[8]) % 4;
                sum += (p[8] + t[5] + t[7] + t[8] + t[9]) % 4;
                sum += (p[9] + t[6] + t[8] + t[9]) % 4;
                if (sum == 0) { 
                    for (int i = 1; i <= 9; i++) {
                        while (t[i]--)
                           cout<<i<<" ";
                    }
                    return 0;
                }

            }
}

感觉这个思路确实很巧妙,学到了很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值