1. 程式人生 > >Simple Version(20 分)(列舉&&邏輯)

Simple Version(20 分)(列舉&&邏輯)

1148 Werewolf - Simple Version(20 分)

Werewolf(狼人殺) is a game in which the players are partitioned into two parties: the werewolves and the human beings. Suppose that in a game,

  • player #1 said: "Player #2 is a werewolf.";
  • player #2 said: "Player #3 is a human.";
  • player #3 said: "Player #4 is a werewolf.";
  • player #4 said: "Player #5 is a human."; and
  • player #5 said: "Player #4 is a human.".

Given that there were 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liers. Can you point out the werewolves?

Now you are asked to solve a harder version of this problem: given that there were N players, with 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liers. You are supposed to point out the werewolves.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (5≤N≤100). Then N lines follow and the i-th line gives the statement of the i-th player (1≤i≤N), which is represented by the index of the player with a positive sign for a human and a negative sign for a werewolf.

Output Specification:

If a solution exists, print in a line in ascending order the indices of the two werewolves. The numbers must be separated by exactly one space with no extra spaces at the beginning or the end of the line. If there are more than one solution, you must output the smallest solution sequence -- that is, for two sequences A=a[1],...,a[M] and B=b[1],...,b[M], if there exists 0≤k<M such that a[i]=b[i] (i≤k) and a[k+1]<b[k+1], then A is said to be smaller than B. In case there is no solution, simply print No Solution.

Sample Input 1:

5
-2
+3
-4
+5
+4

Sample Output 1:

1 4

Sample Input 2:

6
+6
+3
+1
-5
-2
+4

Sample Output 2 (the solution is not unique):

1 5

Sample Input 3:

5
-2
-3
-4
-5
-1

Sample Output 3:

No Solution

【分析】emmm這道題,,題意理解之後還要搞清楚怎麼轉化。感覺我短時間內想不到這種解決方法。感謝小夥伴給我講清楚了~主要還是思維邏輯思維!

列舉i、j(表示兩個狼人),假設的時候只要判斷p[x]是否與i或j相等,即判斷是不是狼人。cnt1和cnt2分別表示說謊的人和狼人的數目,符合題意時只能cnt1=cnt2=1;

【程式碼】

#include<bits/stdc++.h>
using namespace std;
int p[105];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&p[i]);
	int cnt1,cnt2;
	for(int i=1;i<=n;i++)//i,j表示兩個狼人。列舉開始 
	{
		for(int j=i+1;j<=n;j++)
		{
			cnt1=cnt2=0;
			int flag=1;
			for(int k=1;k<=n;k++)
			{
				if(p[k]<0)//k是狼但是k其實是民
				{
					if(-p[k]!=i&&-p[k]!=j)	
					{
						if(k!=i&&k!=j)
							cnt1++;
						if(cnt1+cnt2>2)
						{
							flag=0;break;
						 } 
						 if(k==i||k==j)
						 	cnt2++;
						if(cnt1+cnt2>2)
						{
							flag=0;break;
						}
					} 
				} 
				else{
					if(p[k]==i||p[k]==j)
					{
						if(k!=i&&k!=j)
							cnt1++;
						if(cnt1+cnt2>2)
						{
							flag=0;break;
						 } 
						 if(k==i||k==j)
						 	cnt2++;
						if(cnt1+cnt2>2)
						{
							flag=0;break;
						}
					}
				}
			}
			if(flag&&cnt2==1&&cnt1==1)
			{
				printf("%d %d\n",i,j);
				return 0;
			}
		}
	}
	printf("No Solution\n");
	return 0;
}