原题链接:蓝桥杯算法训练VIP-黑白无常
解题思路:
注意事项:
/*
白纸条: 1
黑纸条: 0
*/
#include<iostream>
using namespace std;
int n; //人数
int cnt; //有多少种方案
int color[10]; //保存每个人头上纸条的颜色
int talk[10][2]; //保存每个人说话的内容
int result[100]; //保存所有白纸条人序号组成的自然数
int colorNum(int x, int col) //检查除自己外还有多少人为白纸条 / 黑纸条
{
int num = 0;
for (int j = 0; j < n; j++)
{
if (j == x)
continue;
else if(color[j] == col)
num++;
}
return num;
}
bool check() //检查说话的真假
{
bool flag;
for (int i = 0; i < n; i++)
{
flag = (colorNum(i, 1) == talk[i][0] && colorNum(i, 0) == talk[i][1]);
if (color[i] == 1) //白纸人说真话
{
if (!flag)
return false;
}
else //黑纸人说假话
{
if (flag)
return false;
}
}
return true;
}
void dfs(int now)
{
if (now == n)
{
if (check()) //如果检查正确
{
int temp = 0;
for (int i = 0; i < n; i++)
{
if (color[i] == 1) //计算此种方案时白纸人序号组成的自然数
temp = temp * 10 + i + 1;
}
result[cnt++]=temp;
}
return;
}
color[now] = 1; //白纸人
dfs(now+1);
color[now] = 0; //黑纸人
dfs(now+1);
}
int main()
{
cin >> n;
cnt = 0;
for (int i = 0; i < n; i++)
cin >> talk[i][0] >> talk[i][1];
dfs(0);
if (cnt == 0) //如果没有白纸人
cout<<"NoSolution."<<endl;
else //找出所有方案中最小的一个数
{
int minNum = 987654321;
for (int i = 0; i < cnt; i++)
{
if (minNum > result[i])
minNum = result[i];
}
cout << minNum;
}
return 0;
}
参考代码:
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复