1. 程式人生 > >Simple Version (20 分)

Simple Version (20 分)

要求:假設一群人中有兩狼人,現在給出一組一些人(狼人)對其他人(狼人)的判斷,如果滿足:人和狼人中各有一人撒謊,則輸出這兩個狼人,

方法:窮舉法,(考場上居然忘記了這種方法),確切的說是沒讀懂題,邏輯推理差,即:假設其中兩個人為狼人,其他為人,則一個一個的判斷,如果最後人和狼人中各只有一個說謊,則為答案,(從小到大判斷,滿足要求的肯定是最小輸出)判斷規則如下:

他為人(狼人),說 一個人為狼人,或者說一個狼人為人,則說謊的人(狼人)加一。        

程式碼:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    //freopen("test.txt","r",stdin);
    int N,i,j,k;
    scanf("%d",&N);
    vector<int>said(N+1);
    for(i=1;i<=N;++i)scanf("%d",&said[i]);//第i個人說said[i]是,輸入小於0為狼人,大於0為人
    for(i=1;i<N;++i){      //假設i,j是狼人,其他為人
        for(j=i+1;j<=N;++j){
            int man=0,wolf=0,flag=0;   //說謊的狼人和人的數量
            for(k=1;k<=N;++k){  //一個一個測試,
                if(flag)break;
                if(k==i||k==j){  //當前檢測的為狼人
                    if(said[k]>0&&(said[k]==i||said[k]==j))++wolf;//說said[k]是人,但said[k]為狼人
                    if(said[k]<0&&(-said[k]!=i&&-said[k]!=j))++wolf;//說said[k]是狼人,但其為人
                    if(wolf>1)flag=1;//兩個狼人說謊
                }else{  //當前檢測的為人
                    if(said[k]<0&&(abs(said[k])!=i&&abs(said[k])!=j))++man;//說said[k]是狼人,但said[k]不是狼人
                    if(said[k]>0&&(said[k]==i||said[k]==j))++man;//說said[k]是人,但其是狼人
                    if(man>1)flag=1; //兩個人說謊
                }
            }
            if(man==1&&wolf==1){  //一次假設成立,即輸出結束
                printf("%d %d",i,j);
                return 0;
            }
        }
    }
    printf("No Solution");
    return 0;
}