Simple Version (20 分)
阿新 • • 發佈:2018-12-10
要求:假設一群人中有兩狼人,現在給出一組一些人(狼人)對其他人(狼人)的判斷,如果滿足:人和狼人中各有一人撒謊,則輸出這兩個狼人,
方法:窮舉法,(考場上居然忘記了這種方法),確切的說是沒讀懂題,邏輯推理差,即:假設其中兩個人為狼人,其他為人,則一個一個的判斷,如果最後人和狼人中各只有一個說謊,則為答案,(從小到大判斷,滿足要求的肯定是最小輸出)判斷規則如下:
他為人(狼人),說 一個人為狼人,或者說一個狼人為人,則說謊的人(狼人)加一。
程式碼:
#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; }