三国杀 张昌蒲 严教 计算器
基于https://blog.youkuaiyun.com/qq_45716735/article/details/124362234更改,修复了一些bug
输入点数,中间用空格隔开,按下回车键结束输入
#include <bits/stdc++.h>
using namespace std;
set<string> Ans;
int input[100];
int i;
int to;
void work(int *a, int len)
{
int sum1 = 0;
int sum2 = 0;
for (int mid = 1; mid < len; mid++)
{
string tempAns1 = "", tempAns2 = "";
int temp[len];
sum2 = 0;
sum1 = 0;
for (int k = 0; k < mid; k++)
{
sum1 += a[k];
temp[k] = a[k];
}
sort(temp, temp + mid);
for (int k = 0; k < mid; k++)
{
tempAns1 += to_string(temp[k]) + " ";
}
for (int k = mid; k < len; k++)
{
sum2 += a[k];
temp[k] = a[k];
}
sort(temp + mid, temp + len);
for (int k = mid; k < len; k++)
{
tempAns2 += to_string(temp[k]) + " ";
}
if (sum1 == sum2)
{
string temps = tempAns1;
tempAns1 += tempAns2;
tempAns2 += temps;
if (Ans.count(tempAns1) == 0 && Ans.count(tempAns2) == 0)
{
Ans.insert(tempAns1);
cout << "情况" << to++ << ":" << endl;
for (int k = 0; k < mid; k++)
{
cout << a[k] << " ";
}
cout << endl;
for (int k = mid; k < len; k++)
{
cout << a[k] << " ";
}
cout << endl
<< "总分牌数:" << len << " 总和:" << sum1 << endl
<< endl;
}
}
tempAns1.clear();
tempAns2.clear();
}
}
int main()
{
to = 1;
string s;
getline(cin, s);
istringstream iss(s);
string ans;
while (iss >> ans)
{
input[i++] = stoi(ans);
}
sort(input, input + i);
for (int len = i; len > 0; len--)
{
Ans.clear();
work(input, len);
while (next_permutation(input, input + i)) //对input数组前i个数进行全排列,选中部分数组会逐渐从大到小排列,当不存在下一个全排列后会将数组从小到大排列
{
work(input, len);
}
}
system("pause");
return 0;
}