1. 程式人生 > >1089 狼人殺-簡單版 (20 分)(cj)

1089 狼人殺-簡單版 (20 分)(cj)

1089 狼人殺-簡單版 (20 分)

以下文字摘自《靈機一動·好玩的數學》:“狼人殺”遊戲分為狼人、好人兩大陣營。在一局“狼人殺”遊戲中,1 號玩家說:“2 號是狼人”,2 號玩家說:“3 號是好人”,3 號玩家說:“4 號是狼人”,4 號玩家說:“5 號是好人”,5 號玩家說:“4 號是好人”。已知這 5 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。扮演狼人角色的是哪兩號玩家?

本題是這個問題的升級版:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人說的不是實話,有狼人撒謊但並不是所有狼人都在撒謊。要求你找出扮演狼人角色的是哪幾號玩家?

輸入格式:

輸入在第一行中給出一個正整數 N(5≤N≤100)。隨後 N 行,第 i 行給出第 i 號玩家說的話(1≤i≤N),即一個玩家編號,用正號表示好人,負號表示狼人。

輸出格式:

如果有解,在一行中按遞增順序輸出 2 個狼人的編號,其間以空格分隔,行首尾不得有多餘空格。如果解不唯一,則輸出最小序列解 —— 即對於兩個序列 A=a[1],...,a[M]和 B=b[1],...,b[M],若存在 0≤k<M 使得 a[i]=b[i] (i≤k),且 a[k+1]<b[k+1],則稱序列 A 小於序列 B。若無解則輸出 No Solution

輸入樣例 1:

5
-2
+3
-4
+5
+4

輸出樣例 1:

1 4

輸入樣例 2:

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

輸出樣例 2(解不唯一):

1 5

輸入樣例 3:

5
-2
-3
-4
-5
-1

輸出樣例 3:

No Solution

題目的資料規模很小,但是很難想。 就是 倆個狼人 一個說謊  和一個說謊的平民 , 直接列舉暴力即可。 

code

#pragma warning(disable:4996)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int varr[105];
int map[105];
int tmp[105];
int n, x;
void init();
int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> varr[i];
	}
	bool f = 1, ff = 0;
	for (int i = 1; i < n; ++i) {
		for (int j = i + 1; j <= n; ++j) {
			for (int k = 1; k <= n; ++k) {
				if (k == i || k == j) continue;
				init();
				tmp[i] = -varr[i];
				tmp[k] = -varr[k];
				map[i] = 1;
				map[j] = 1;
				for (int i = 1; i <= n; ++i) {
					if ((tmp[i] > 0 && map[tmp[i]] == 0) || (tmp[i] < 0 && map[-tmp[i]] == 1));
					else {
						f = 0;
						break;
					}
				}
				if (f == 1) {
					cout << i << ' ' << j << endl;
					ff = 1;
					break;
				}
				else f = 1;
				if (i == 1 && j == 4) {
			
				}
				init();
				tmp[j] = -varr[j];
				tmp[k] = -varr[k];
				map[i] = 1;
				map[j] = 1;
				for (int i = 1; i <= n; ++i) {
					if ((tmp[i] > 0 && map[tmp[i]] == 0) || (tmp[i] < 0 && map[-tmp[i]] == 1));
					else {
						f = 0;
						break;
					}
				}
				if (f == 1) {
					cout << i << ' ' << j << endl;
					ff = 1;
					break;
				}
				else f = 1;
			}
			if (ff == 1) break;
		}
		if (ff == 1) break;
	}
	if (ff == 0) cout << "No Solution" << endl;
	system("pause");
	return 0;
}
void init() {
	for (int i = 1; i <= n; ++i) {
		tmp[i] = varr[i];
		map[i] = 0;
	}
}