QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#291809#7179. Fischer's Chess Guessing GameOAleksaWA 24ms3712kbC++142.1kb2023-12-27 08:38:402023-12-27 08:38:41

Judging History

你现在查看的是最新测评结果

  • [2023-12-27 08:38:41]
  • 评测
  • 测评结果:WA
  • 用时:24ms
  • 内存:3712kb
  • [2023-12-27 08:38:40]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define int long long
vector<char> sv = {'K', 'Q', 'N', 'N', 'B', 'B', 'R', 'R'};
vector<string> perm;
int good(vector<char> ord) {
	int x = -1, y = -1, z = -1, b = -1, a = -1;
	for (int i = 0;i < 8;i++) {
		if (ord[i] == 'K')
			z = i;
		else if (ord[i] == 'B') {
			if (x == -1)
				x = i;
			else
				y = i;
		}
		else if (ord[i] == 'R') {
			if (a == -1)
				a = i;
			else
				b = i;
		}
	}
	return z < b && z > a && x % 2 != y % 2;
};
int diff(string a, string b) {
	int r = 0;
	for (int i = 0;i < 8;i++)
		r += (a[i] == b[i]);
	return r;
};
void resi(string ans, int g) {
	cout << ans << endl;
	int r;
	cin >> r;
	if (r == 8 || g > 6)
		return;
	vector<string> temp;
	for (auto x : perm) {
		if (diff(ans, x) == r)
			temp.push_back(x);
	}
	int mn = 1e9;
	for (auto u : temp) {
		vector<int> cnt(10);
		int mx = 0;
		for (auto x : perm) 
			mx = max(mx, ++cnt[diff(u, x)]);
		if (mx < mn) {
			mn = mx;
			ans = u;
		}
	}
	resi(ans, g + 1);
}
signed main() {
	ios_base::sync_with_stdio(false);
  cout.tie(nullptr); 
  cin.tie(nullptr);
  //freopen("newbarn.in", "r", stdin);
  //freopen(newbarn.out", "w", stdout);
  int tt = 1;
  //cin >> tt;
  while (tt--) {
  	vector<int> order(8);
  	iota(order.begin(), order.end(), 0);
  	map<string, int> bio;
  	do {
  		vector<char> t;
  		for (int i = 0;i < 8;i++)
  			t.push_back(sv[order[i]]);
  		if (good(t)) {
  			string s;
  			for (auto x : t)
  				s += x;
  			if (bio[s])
  				continue;
  			bio[s] = 1;
  			perm.push_back(s);
  		}
  	} while (next_permutation(order.begin(), order.end()));
  	int mx = 1e9;
  	string ans;
  	for (int i = 0;i < 960;i++) {
  		vector<int> cnt(10);
  		int l = 0;
  		for (int j = 0;j < 960;j++) {
  			if (i == j)
  				continue;
  			l = max(l, ++cnt[diff(perm[i], perm[j])]);
  		}
  		if (l < mx) {
  			ans = perm[i];
  			mx = l;
  		}
  	}
  	while (true) {
  		string s;
  		cin >> s;
  		if (s == "GAME") {
  			cin >> s;
  			resi(ans, 0);
  		}
  		else
  			break;
  	}
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 24ms
memory: 3712kb

input:

GAME 1
2
4
4
4
4
4

output:

NRNBBKQR
RQKBBNRN
RKQNBBRN
RQKBBNRN
RKQNBBRN
RQKBBNRN

result:

wrong answer (i) too many guesses in game 1, pos = p\x7f\x01z