21
This commit is contained in:
parent
61e230c0a5
commit
9204e48fbc
21
lab_3/21/Makefile
Normal file
21
lab_3/21/Makefile
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
binary = queens
|
||||||
|
folder = queens
|
||||||
|
objects = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
|
||||||
|
|
||||||
|
run: $(binary)
|
||||||
|
./$(binary)
|
||||||
|
|
||||||
|
$(binary): $(objects)
|
||||||
|
g++ -g3 -o $@ $^
|
||||||
|
|
||||||
|
%.o: %.cpp
|
||||||
|
g++ -g3 -c -o $@ $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
|
||||||
|
clear: clean
|
||||||
|
rm -f *.zip $(binary)
|
||||||
|
|
||||||
|
zip: clean
|
||||||
|
zip $(folder) Makefile *.cpp *.h
|
65
lab_3/21/queens.cpp
Normal file
65
lab_3/21/queens.cpp
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
#include "queens.hh"
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
|
using namespace queens;
|
||||||
|
|
||||||
|
Configuration::Configuration(int m, int n, int number_of_pieces) {
|
||||||
|
this->number_of_pieces = number_of_pieces;
|
||||||
|
this->board = new Board;
|
||||||
|
|
||||||
|
this->board->m = m; //x direction
|
||||||
|
this->board->n = n; //y direction
|
||||||
|
|
||||||
|
//get a random number generator:
|
||||||
|
//the random device that will seed the generator
|
||||||
|
std::random_device seeder;
|
||||||
|
//then make a mersenne twister engine
|
||||||
|
std::mt19937 engine(seeder());
|
||||||
|
//then the easy part... the distribution
|
||||||
|
std::uniform_int_distribution<int> m_rand(1, m);
|
||||||
|
std::uniform_int_distribution<int> n_rand(1, n);
|
||||||
|
|
||||||
|
for (int i=0; i<number_of_pieces; i++)
|
||||||
|
{
|
||||||
|
this->pieces.push_back(Queen(m_rand(engine), n_rand(engine)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<Conflict> Configuration::get_conflicts()
|
||||||
|
{
|
||||||
|
std::vector<Conflict> conflicts;
|
||||||
|
for (int i = 0; i<this->number_of_pieces; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
// The piece we will check against the others:
|
||||||
|
Piece* piece = &this->pieces[i];
|
||||||
|
// For every new i we need to check one fewer i
|
||||||
|
for (int j = i+1; j<number_of_pieces; j++)
|
||||||
|
{
|
||||||
|
Piece* enemy_piece = &this->pieces[j];
|
||||||
|
if (piece->x == enemy_piece->x or
|
||||||
|
piece->y == enemy_piece->y or
|
||||||
|
piece->x - enemy_piece->x == piece->y - enemy_piece->x)
|
||||||
|
{
|
||||||
|
Conflict conflict;
|
||||||
|
conflict.piece_1 = i;
|
||||||
|
conflict.piece_1_x = piece->x;
|
||||||
|
conflict.piece_1_y = piece->y;
|
||||||
|
conflict.piece_2 = j;
|
||||||
|
conflict.piece_2_x = enemy_piece->x;
|
||||||
|
conflict.piece_2_y = enemy_piece->y;
|
||||||
|
conflicts.push_back(conflict);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return conflicts;
|
||||||
|
}
|
||||||
|
|
||||||
|
Piece::Piece(int x, int y)
|
||||||
|
{
|
||||||
|
this->x = x;
|
||||||
|
this->y = y;
|
||||||
|
}
|
48
lab_3/21/queens.hh
Normal file
48
lab_3/21/queens.hh
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
#include <array>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace queens
|
||||||
|
{
|
||||||
|
// Easy way represent a conflict:
|
||||||
|
struct Conflict
|
||||||
|
{
|
||||||
|
int piece_1;
|
||||||
|
int piece_1_x;
|
||||||
|
int piece_1_y;
|
||||||
|
int piece_2;
|
||||||
|
int piece_2_x;
|
||||||
|
int piece_2_y;
|
||||||
|
};
|
||||||
|
class Piece
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
|
||||||
|
Piece(int x, int y);
|
||||||
|
};
|
||||||
|
class Queen: public Piece
|
||||||
|
{
|
||||||
|
using Piece::Piece;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Board
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int m;
|
||||||
|
int n;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Configuration
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int number_of_pieces;
|
||||||
|
std::vector<Piece> pieces;
|
||||||
|
Board* board;
|
||||||
|
|
||||||
|
Configuration(int m, int n, int number_of_pieces);
|
||||||
|
std::vector<Conflict> get_conflicts();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
21
lab_3/21/test.cpp
Normal file
21
lab_3/21/test.cpp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#include "queens.hh"
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
void print_conflict(queens::Conflict c)
|
||||||
|
{
|
||||||
|
std::cout << "🚨 Conflict! "<< "Piece 1: x="<< c.piece_1_x << ", y=" << c.piece_1_y
|
||||||
|
<< " Piece 2: x="<< c.piece_2_x << ", y=" << c.piece_2_y << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
queens::Configuration config = queens::Configuration(8, 8, 10);
|
||||||
|
std::vector<queens::Conflict> conflicts = config.get_conflicts();
|
||||||
|
for (int i=0; i<conflicts.size(); i++)
|
||||||
|
{
|
||||||
|
print_conflict(conflicts[i]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user