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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "osalib.h"
#include <vector>
#include <iostream>
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

char **b;
int nn;
int mm;

using namespace std;

class Point {
private:
	int x;
	int y;
public:
	Point(int _x, int _y) {
		this->x = _x;
		this->y = _y;
	}
	int getX(){
		return this->x;
	}
	int getY(){
		return this->y;
	}
};

bool isInPoints(vector<Point> points, int x, int y) {
	for(int i = 0; i < points.size(); i++) {
		Point p = points[i];
		if(x == p.getX() && y == p.getY()) {
			return true;
		}
	}
	return false;
}

void findPath(vector<Point> visited, vector<Point> &found, unsigned long long int count, int x, int y) {
	if(count == found.size()) {
		return;
	}
	if(b[x][y] == 'K' && !isInPoints(found, x, y)) {
		found.push_back(Point(x, y));
		if(count == found.size()) {
			return;
		}
	}
	visited.push_back(Point(x, y));
	if(x+1 < nn && b[x+1][y] != 'W' && !isInPoints(visited, x+1, y))
		findPath(visited, found, count, x+1, y);
	if(x-1 >= 0 && b[x-1][y] != 'W' && !isInPoints(visited, x-1, y))
		findPath(visited, found, count, x-1, y);
	if(y+1 < mm && b[x][y+1] != 'W' && !isInPoints(visited, x, y+1))
		findPath(visited, found, count, x, y+1);
	if(y-1 >= 0 && b[x][y-1] != 'W' && !isInPoints(visited, x, y-1))
		findPath(visited, found, count, x, y-1);
}

void NowaWyspa(int n, int m, char **Board) {
	nn = n;
	mm = m;
	b = (char**)malloc(n * m * sizeof(char*));
	memcpy(b, Board, sizeof (char*) * n * m);
}

int NowaWarownia(int r, int c) {
	b[r-1][c-1] = 'W';
	vector<Point> visited;
	vector<Point> found;
	int i = 0;
	int j = 0;
	int x = 0;
	int y = 0;
	unsigned long long int count = 0;
	for(i = 0 ; i < nn; i++) {
		for(j = 0 ; j < mm; j++) {
			if(b[i][j] == 'K') {
				count++;
				x = i;
				y = j;
			}
		}
	}
	findPath(visited, found, count, x, y);
	if(found.size() == count) {
		return 1;
	}
	b[r-1][c-1] = '.';
	return 0;
}

void PrzeniesOsade(int r1, int c1, int r2, int c2) {
	b[r1-1][c1-1] = '.';
	b[r2-1][c2-1] = 'K';
}