lalalala


私信TA

用户名:zhangshuo

访问量:151912

签 名:

像狗一样的学习,像绅士一样地玩耍。

等  级
排  名 6
经  验 30142
参赛次数 10
文章发表 201
年  龄 12
在职情况 学生
学  校 芜湖市第十一中学
专  业

  自我简介:

今日懒惰流下的口水,将会成为明日里伤心的泪水。

解题思路:





注意事项:

/*
    白纸条: 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分

4 人评分

  评论区