ブラック&ホワイト⽆ことが多いです
問題の説明
寮の学生⼀学術の完了後にゲームをプレイする準備ができて:
ゲームは各フェイスヘッドが紙の白いシートの間に⼀掲載されているか、ブラックが表示され、今すべての顔が言うようなものです
⼀語句「私は、x見白との間の用紙Y 紙の黒色変色ピース」
個別の保証に対する各ヘッドが白い紙の顔が真実を話すことが知られている、黒人に対する各ヘッドは、フェイスペーパーが嘘だったと思われます
今、顔の頭に近い裁判官にお聞き紙の白い部分つまり、もし解決策出力⽆「NoSolution。」;
ソリューションの複数のセット場合は、各回答はズーム構図⼩数に応じて、白のペースト顔バー配置に入れ⼀
紙に対する最初のフレームおよび第三の面顔ヘッドが白であるように(⽐、その後数は13です。
最初の場合は6 、7 面8は、紙の白い部分を転記され、その後数は678 )
小さいサイズの最小数の出力(すべてのノートは黒、空に満ちている場合は場合は、出力0です)
START入力フォーマット
初めて⾏⼀整数nは、続いてN 最初に⾏ I ⾏二つの整数、X 及びY のそれぞれ、私の顔によると、「私は、x見シートyを紙の白い部分とその黒色変色紙記事。 "
出力フォーマット
⼀⾏。⽆ソリューション出力の場合、 "NoSolution。"。
すべてのノートは黒、空に満ちている場合、最も小さいサイズは、ケース、出力0であると回答(⻅問題の具体的な説明)に別段の出力値
サンプルを失うSTART
2
1 0
1 0
サンプル出力
0
サンプルを失うSTART
5
3 1
0 4
1 3
4 0
1 3
サンプル出力
35
スケールデータと規則
N <= 8
分析:
1.現在の状況が存在してもよいかどうかを決定するために、顔にケースを全て黒と白の音符を列挙し、すべての可能なケースが最も小さいサイズの出力を収集します
各ノート自分の顔が~~~の頭を見ることができない2.注意
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> ansv;
pair<int, int> v[10];
int n, k, cnt, a[10];
void dfs(int num) {
if ( num == 0) {
int white = 0, black = 0, ans = 0;
for ( int i = 1; i <= n; i++) {
if (a[i] == -1) black++;
if (a[i] == 1) white++;
}
for (int i = 1; i <= n; i++) {
if (a[i] == 1 && (v[i].first != white-1 ||v[i].second !=black))
return;
if ( a[i] == -1 && (v[i].first == white && v[i].second ==black-1) )
return;
}
for ( int i = 1; i <= n; i++)
if ( a[i] == 1)
ans = ans * 10 + i;
ansv.push_back(ans);
}
else {
a[num] = -1;
dfs(num - 1);
a[num] = 1;
dfs(num - 1);
}
}
int main() {
scanf("%d", &n);;
for ( int i = 1; i <= n; i++)
scanf("%d%d", &v[i].first, &v[i].second);
dfs(n);
sort(ansv.begin(), ansv.end());
printf("%d\n", ansv[0]);
return 0;
}