1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <bits/stdc++.h>

#include "osalib.h"

using namespace std;

vector<vector<char> > v;
int cnt;
int xx, yy;

void NowaWyspa(int x, int y, char **b) {
	v = vector<vector<char> >(x, vector<char>(y));
	cnt = 0;
	for (int i=0; i<x; ++i) for (int j=0; j<y; ++j) {
		v[i][j] = b[i][j];
		if (v[i][j] == 'K') {
			if (cnt == 0) xx = i, yy = j;
			++cnt;
		}
	}
}

int NowaWarownia(int a, int b) {
	--a; --b;
//cout << "start\n";
	char cc = v[a][b];
	v[a][b] = 'W';
	if (cnt <= 1) return 1;
	vector<vector<int> > visited(v.size(), vector<int>(v[0].size(), 0));
	visited[xx][yy] = 1;
	queue<pair<int, int> > q;
	q.push(make_pair(xx, yy));
	int done = 1;
	while (!q.empty() && done < cnt) {
		int x = q.front().first;
		int y = q.front().second;
//cout << x << " " << y << " " << done << " " << cnt << "\n";
		q.pop();
		int ii, jj;
		ii = x-1; jj = y; if (ii>=0 && ii<v.size() && jj>=0 && jj<v[0].size() && visited[ii][jj] == 0 && v[ii][jj] != 'W') { visited[ii][jj] = 1; q.push(make_pair(ii, jj)); if (v[ii][jj] == 'K') ++done; }
		ii = x+1; jj = y; if (ii>=0 && ii<v.size() && jj>=0 && jj<v[0].size() && visited[ii][jj] == 0 && v[ii][jj] != 'W') { visited[ii][jj] = 1; q.push(make_pair(ii, jj)); if (v[ii][jj] == 'K') ++done; }
		ii = x; jj = y-1; if (ii>=0 && ii<v.size() && jj>=0 && jj<v[0].size() && visited[ii][jj] == 0 && v[ii][jj] != 'W') { visited[ii][jj] = 1; q.push(make_pair(ii, jj)); if (v[ii][jj] == 'K') ++done; }
		ii = x; jj = y+1; if (ii>=0 && ii<v.size() && jj>=0 && jj<v[0].size() && visited[ii][jj] == 0 && v[ii][jj] != 'W') { visited[ii][jj] = 1; q.push(make_pair(ii, jj)); if (v[ii][jj] == 'K') ++done; }
	}
	if (done == cnt) return 1;
	v[a][b] = cc;
	return 0;
}

void PrzeniesOsade(int a1, int b1, int a2, int b2) {
	--a1; --b1; --a2; --b2;
	if (xx == a1 && yy == b1) xx = a2, yy = b2;
	v[a1][b1] = '.';
	v[a2][b2] = 'K';
}