这是参加银行笔试的一道题
一个没看明白的题:为什么只输出了一种情况,我只能理解为将原数组中的重复元素只保留第一个出现的那个,然后进行查找策略,可能是我太菜了,求指点
#include<iostream>
using namespace std;
int n[101], a[10];
bool vis[101];
int i = 0;
void dfs(int dep, int k, int s) {//dep表示搜索层数,k表示状态
if (dep == 4 && s != 0) return;
if (dep == 4 && s == 0) {
for (int j = 1; j < dep; j++)
cout << a[j] << " ";
cout << endl;
}
for (int j = k; j < i; j++)
if(!vis[j]){
vis[j] = 1;
a[dep] = n[j];
dfs(dep + 1, j+1, s - n[j]);
vis[j] = 0;
}
}
void del_same(int* b) {
for(int j=1;j<i;j++)
for(int k=j+1;k<i;k++)
if(b[j]==b[k]){
for (int h = k + 1; h < i; h++)
b[h - 1] = b[h];
i--;
}
}
int main()
{
memset(n, -99, 101);
while (cin >> n[++i]);//数据输入
//i--;//除去ctrl+z的输入
dfs(1,1,1);//从第一层 第一个数据开始搜索三个数的和为1的情况
cout << endl << endl;
del_same(n);//删除数组中相同的元素
for (int j = 1; j < i; j++)//数据输出,检测
cout << n[j] << " ";
cout << endl;
dfs(1, 1, 1);//从第一层 第一个数据开始搜索三个数的和为1的情况
return 0;
}
输入(需要加ctrl+z然后回车)
-1 0 2 2 0 -4
输出
-1 0 2
-1 0 2
-1 2 0
-1 2 0
-1 0 2 -4
-1 0 2