洛谷—题解 P1008 【三连击】

原题链接P1008三连击
洛谷网站原图截屏

输入输出样例

输入样例#1:

输出样例#1:
192 384 576



(输出被和谐了)

题解

废话部分:
建议在看这篇文章之前,推荐看一下全排列问题
如果盆友们已经厌倦了暴力枚举(暴力枚举我会单独再写一份),可以看看这篇文章。基于万能的搜索实现的,dfs,很科学,很平易近人。如果盆友们对深度优先搜索DFS了解不是很好的话,可以看《啊哈!算法》这本书,比较适合像我一样的初学者,或者等我专门介绍深度优先搜索DFS的博客。

正常部分:
将全排列问题修改一下,因为1-9的全排列也同样是9个数字不允许重复,把放入盒子(数组)里面的卡片(数字)组合成三个数,看是否符合我们要的1:2:3的比例问题,改变if语句中的判断标准为

(a[1]*100+a[2]*10+a[3])*2==(a[4]*100+a[5]*10+a[6])&&((a[1]*100+a[2]*10+a[3])*3==(a[7]*100+a[8]*10+a[9]))

就可以解决我们的问题了。

实现代码如下:

#include <iostream>
#include <cstdio>

using namespace std;

void dfs(int step);

int a[10],book[10],n=9;
bool flag=true;

void dfs(int step)
{
	int i;
	if(step==n+1)
	{
		if((a[1]*100+a[2]*10+a[3])*2==(a[4]*100+a[5]*10+a[6])&&((a[1]*100+a[2]*10+a[3])*3==(a[7]*100+a[8]*10+a[9])))
		{
			cout<<a[1]<<a[2]<<a[3]<<" "<<a[4]<<a[5]<<a[6]<<" "<<a[7]<<a[8]<<a[9]<<endl;
			flag = false;
		}

		return;
	}

	for(i=1;i<=n;i++)
	{
		if(book[i]==0)
		{
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;
		}
	}

	return;
}


int main()
{
	dfs(1);
	return 0;
}

运行结果为:

192 384 576
219 438 657
273 546 819
327 654 981

如果这道题看懂了,可以尝试一下
P1618三连击(升级版)

类似的问题反复加深和应用,有助于我们的编程学习。

新手上路,希望大家多多指教,多多批评,多多交流。

我是Mario,一个立志要考进MIT的程序猿

以上内容仅是个人观点,如果涉及版权的问题,请联系我第一时间删除。

发布了15 篇原创文章 · 获赞 12 · 访问量 1429

猜你喜欢

转载自blog.csdn.net/qq_41616301/article/details/88776249
今日推荐