原题链接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的程序猿
以上内容仅是个人观点,如果涉及版权的问题,请联系我第一时间删除。