C++版暴力回溯法(祥瑞生辉)

问题描述:

\,\,  \text{祥瑞生辉}\\\underline{+\text{三羊献瑞}}\\{三羊生瑞气}

祥、瑞、生、辉、三、羊、献、气为0~9的任意不重复的数字,需要根据以上的等式得到“祥瑞生辉”的具体可能值为多少。


求解思路:

使用经典的回溯法的思路,用int a[8]来记录祥、瑞、生、辉、三、羊、献、气的值,用bool b[10]来记录0~9这10个数字是否已经给使用,在回溯的过程中适当运用剪枝来加速程序的运行速度(祥 不为 0,三 不为 0)。


C++代码:

#include<iostream>

using namespace std;

int a[8];

bool b[10];

void dfs(int cur) {

if (cur == 8) {

int x = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3];

int y = a[4] * 1000 + a[5] * 100 + a[6] * 10 + a[1];

int z = a[4] * 10000 + a[5] * 1000 + a[2] * 100 + a[1] * 10 + a[7];

if (x + y == z)

    cout << x << endl;

return;

}

else {

for (int i = 0; i < 10; i++) {

if (i == 0 && cur == 0) continue; //祥不为0

if (i == 0 && cur == 4) continue; //三不为0

if (!b[i]) {

b[i] = 1;

a[cur] = i;

dfs(cur + 1);

b[i] = 0;

}

}

}

}

int main() {

dfs(0);

return 0;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容