[C++] 排列
题目
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
分析
刚开始学C++,看网上的不太懂,于是自己用一种笨方法实现了。
首先是三位数限制,那么第一个数一定在111和333之间,for循环判断。只要生成第一个数,那么第二个,第三个随之确定,那么再判断第二个和第三个数是否满足条件即可,有些麻烦。
创建一个全为0的数组,如果使用过,将相对的置1,后面判断就根据这个数组判断1-9哪些使用过。不合格清零。
代码实现
#include <iostream>
using namespace std;
bool ifNotZero(int x,int arr[10]){
bool b = false;
if(arr[x] == 1)
b = true;
return b;
}
int main()
{
int n1,n2,n3,n21,n22,n23,n31,n32,n33;
int arr[10]={0,0,0,0,0,0,0,0,0,0};
for(int a = 1; a <= 3; a++)
{
arr[a] = 1;
for(int b = 1; b <= 9; b++)
{
if(ifNotZero(b, arr)) continue;
arr[b] = 1;
for(int c = 1; c <= 9; c++)
{
if(ifNotZero(c, arr)) continue;
arr[c] = 1;
n1 = a * 100 + b * 10 + c;
//第二个数字检测
n2 = n1 * 2;
n21 = n2 / 100;
n22 = (n2 % 100) / 10;
n23 = n2 % 10;
if(ifNotZero(n21, arr)){
arr[c] = 0;
continue;
}
arr[n21] = 1;
if(ifNotZero(n22, arr)){
arr[c] = 0;
arr[n21] = 0;
continue;
}
arr[n22] = 1;
if(ifNotZero(n23, arr)){
arr[c] = 0;
arr[n21] = 0;
arr[n22] = 0;
continue;
}
arr[n23] = 1;
//第三个数字检测
n3 = n1 * 3;
n31 = n3 / 100;
n32 = (n3 % 100) / 10;
n33 = n3 % 10;
if(ifNotZero(n31, arr)){
arr[c] = 0;
arr[n21] = 0;
arr[n22] = 0;
arr[n23] = 0;
continue;
}
arr[n31] = 1;
if(ifNotZero(n32, arr)){
arr[c] = 0;
arr[n21] = 0;
arr[n22] = 0;
arr[n23] = 0;
arr[n31] = 0;
continue;
}
arr[n32] = 1;
if(ifNotZero(n33, arr)){
arr[c] = 0;
arr[n21] = 0;
arr[n22] = 0;
arr[n23] = 0;
arr[n31] = 0;
arr[n32] = 0;
continue;
}
cout<<"\""<<n1<<" "<<n2<<" "<<n3<<"\""<<endl;
arr[c] = 0;
arr[n21] = 0;
arr[n22] = 0;
arr[n23] = 0;
arr[n31] = 0;
arr[n32] = 0;
arr[n33] = 0;
}
arr[b] = 0;
}
}
return 0;
}