#include <iostream>
using namespace std;
int mul1[5]; // 第一个乘数
int mul2; // 第二个乘数
int result[5]; // 结果
bool used[10]; // 记录每个数字是否用过
/** 对乘数的每一位进行列举 **/
// digit 是位数: 个十百千分别是1234
// carry 是上一位的进位
void fun(int digit, int carry)
{
if (digit > 4)
{
if (carry > 0)
return;
/* 找到,输出结果 */
int i;
for (i = 4; i >= 1; i--)
cout << mul1[i];
cout << endl;
cout << "* " << mul2 << endl;
cout << "----" << endl;
for (i = 4; i >= 1; i--)
cout << result[i];
cout << endl << endl;
}
int num;
int temp;
/* 枚举这一位所有的数字 */
for (int i = 1; i <= 9; i++)
{
/* 若数字用过则继续寻找 */
// 这里可以剪掉很多枝
if (used[i])
continue;
temp = i * mul2 + carry;
num = temp % 10;
if (used[num] || num == 0 || i == num)
continue;
/* 记录 */
mul1[digit] = i;
result[digit] = num;
/* 继续 DFS 遍历 */
used[i] = true;
used[num] = true;
fun(digit+1, temp/10);
used[i] = false;
used[num] = false;
}
}
int main()
{
for (mul2 = 2; mul2 <= 9; mul2++)
{
used[mul2] = true;
fun(1, 0);
used[mul2] = false;
}
return 0;
}

http://blog.sina.com.cn/u/4b09e6080100071n


浙公网安备 33010602011771号