Untitled
unknown
plain_text
a year ago
4.9 kB
10
Indexable
#include <iostream>
#include <unordered_map>
#include <set>
#include <vector>
#define MAX_N 25
using namespace std;
struct Country{
string name;
int numSolider;
int group;
};
Country map[MAX_N][MAX_N];
unordered_map<string, int> mp;
set<int>lienminh[626];
set<int> groups[626];
set<int> enemy[626];
int cntGr;
int n;
int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
void init(int N, int mSoldier[25][25], char mMonarch[25][25][11])
{
n = N;
cntGr = 1;
mp.clear();
for(int i=0; i<626; i++) {
groups[i].clear();
enemy[i].clear();
}
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
string s = "";
for (char ch = 0; mMonarch[i][j][ch] != '\0'; ch++) {
s += mMonarch[i][j][ch];
}
mp[s] = i * N + j;
map[i][j].name = s;
map[i][j].group = 0;
map[i][j].numSolider = mSoldier[i][j];
}
}
}
void destroy()
{
}
int ally(char mMonarchA[11], char mMonarchB[11])
{
string sA = "", sB = "";
for (char ch = 0; mMonarchA[ch] != '\0'; ch++) {
sA += mMonarchA[ch];
}
for (char ch = 0; mMonarchB[ch] != '\0'; ch++) {
sB += mMonarchB[ch];
}
int rA = mp[sA] / n;
int cA = mp[sA] % n;
int rB = mp[sB] / n;
int cB = mp[sB] % n;
if(map[rA][cA].group == 0 && map[rB][cB].group == 0) { // Cả 2 nước chưa có Group
map[rA][cA].group =cntGr;
map[rB][cB].group = cntGr;
groups[cntGr].insert(mp[sA]);
groups[cntGr].insert(mp[sB]);
cntGr++;
return 1;
}
else if(map[rA][cA].group > 0 && map[rB][cB].group == 0) { // Nước A đã có group và nước B không có
int gr = map[rA][cA].group;
groups[gr].insert(mp[sB]);
return 1;
}
else if(map[rB][cB].group > 0 && map[rA][cA].group == 0) { // Nước B đã có group và nước A không có
int gr = map[rB][cB].group;
groups[gr].insert(mp[sA]);
return 1;
}
else if(map[rB][cB].group == map[rA][cA].group) { // Cung group
return -1;
}
return -2;
}
int attack(char mMonarchA[11], char mMonarchB[11], char mGeneral[11])
{
string sA = "", sB = "";
for (char ch = 0; mMonarchA[ch] != '\0'; ch++) {
sA += mMonarchA[ch];
}
for (char ch = 0; mMonarchB[ch] != '\0'; ch++) {
sB += mMonarchB[ch];
}
int rA = mp[sA] / n;
int cA = mp[sA] % n;
int rB = mp[sB] / n;
int cB = mp[sB] % n;
if(map[rA][cA].group == map[rB][cB].group) { // 2 nước đã là liên minh
return -1;
}
int numAttack = 0;
int numDef = map[rB][cB].numSolider;
int res = -1;
bool canAttack = false;
vector<pair<int, int>> friendA;
vector<pair<int, int>> friendB;
//Khi chưa có quan hệ gì hoặc đã là thù địch
for(int k=0; k<8; k++) {
int nx = rB + dx[k];
int ny = cB + dy[k];
if(nx >= 0 && nx < n && ny >= 0 && ny < n) { //Trong grid
if(map[rA][cA].group == map[nx][ny].group) { // Nước kề cạnh với B là đồng minh của nước A
canAttack = true;
friendA.push_back(make_pair(nx, ny));
//numAttack += map[nx][ny].numSolider / 2;
}
else if(map[rB][cB].group == map[nx][ny].group) {
//numDef += map[nx][ny].numSolider / 2;
friendA.push_back(make_pair(nx, ny));
}
}
if(canAttack) {
//Nước A + đồng minh <-> Nước B + đồng minh
/*map[rA][cA].relate[mp[sB]] = -2;
map[rB][cB].relate[mp[sA]] = -2;*/
int grA = map[rA][cA].group;
int grB = map[rB][cB].group;
enemy[grA].insert(grB);
enemy[grB].insert(grA);
for(auto it: friendA) {
//Giảm 1 nửa quân đội các nước attack
numAttack += map[it.first][it.second].numSolider / 2;
map[it.first][it.second].numSolider -= map[it.first][it.second].numSolider / 2;
}
for(auto it: friendB) {
//Giảm 1 nửa quân đội các nước def
numDef += map[it.first][it.second].numSolider / 2;
map[it.first][it.second].numSolider -= map[it.first][it.second].numSolider / 2;
}
if(numDef >= numAttack) { // Thủ thành công
res = 0;
map[rB][cB].numSolider = numDef - numAttack;
}
else { // Tấn công thành công
//Thay đổi tên vua nước mới
int newNumSolider = numAttack - numDef;
string sG = "";
for (char ch = 0; mGeneral[ch] != '\0'; ch++) {
sG += mGeneral[ch];
}
map[rB][cB].name = sG;
map[rB][cB].numSolider = newNumSolider;
res = 1;
}
}
else res = -2;
}
return res;
}
int recruit(char mMonarch[11], int mNum, int mOption)
{
string s = "";
for (char ch = 0; mMonarch[ch] != '\0'; ch++) {
s += mMonarch[ch];
}
int r = mp[s] / n;
int c = mp[s] % n;
if(mOption == 0) {
map[r][c].numSolider += mNum;
}
else {
int gr = map[r][c].group;
for(auto pos : groups[gr]) {
int row = pos / n;
int col = pos % n;
map[row][col].numSolider += mNum;
}
}
return -1;
}
Editor is loading...
Leave a Comment