#include #include #include #include #include #include #include #include using namespace std; const short unsigned int BOARD = 200; const short unsigned int QUEENS = 1000; int gb[BOARD][BOARD];// masiv igrova daska int qns[QUEENS][4]; // masiv pozicii na carici {n,n,q} int qnsr[BOARD][BOARD]; // masiv sila na caricite int qpos[BOARD][BOARD]; // masiv pozicii na caricite int gbs[BOARD*BOARD][3]; int n = 1; // razmer na daskata; 1, max 200 int r = 1; // obhvat na caricata; 1, max N int k = 0; // dvoiki carici; max 1000 unsigned int qcount = 0; int evaluateQueen(int gb[BOARD][BOARD], int x, int y, int n, int r){ int sum = 0; int cm[10] = {0,0,0,0,0,0,0,0,0,0}; for (int a = 1; a <= r; a++){ // upper left diagonal if (((x-a)<0) || ((y-a)<0)) break; cm[gb[x-a][y-a]]++; sum = sum + gb[x-a][y-a]; } for (int b = 1; b <= r; b++){ // upper vertical if ((y-b)<0) break; cm[gb[x][y-b]]++; sum = sum + gb[x][y-b]; } for (int c = 1; c <= r; c++){ // upper right diagonal if (((x+c)>n-1) || ((y-c)<0)) break; cm[gb[x+c][y-c]]++; sum = sum + gb[x+c][y-c]; } for (int d = 1; d <= r; d++){ // right horizontal if ((x+d)>n-1) break; cm[gb[x+d][y]]++; sum = sum + gb[x+d][y]; } for (int e = 0; e <= r; e++){ // lower right diagonal if (((x+e)>n-1) || ((y+e)>n-1)) break; cm[gb[x+e][y+e]]++; sum = sum + gb[x+e][y+e]; } for (int f = 0; f <= r; f++){ // lower vertical if ((y+f)>n-1) break; cm[gb[x][y+f]]++; sum = sum + gb[x][y+f]; } for (int g = 0; g <= r; g++){ // lower left diagonal if (((x-g)<0) || ((y+g)>(n-1))) break; cm[gb[x-g][y+g]]++; sum = sum + gb[x-g][y+g]; } for (int h = 0; h <= r; h++){ // left horizontal if ((x-h)<0) break; cm[gb[x-h][y]]++; sum = sum + gb[x-h][y]; } int max_cm = 0; for (int i = 0; i < 10; i++){ if (max_cm < cm[i]){ max_cm = i; } } return sum * max_cm; } int checkConnections(int x, int y){ int cons = 0; for (int a = 1; a <= r; a++){ // upper left diagonal if (((x-a)<0) || ((y-a)<0)) break; if (qpos[x-a][y-a] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-a; qns[cons][3] = y-a; cons++; } } for (int b = 1; b <= r; b++){ // upper vertical if ((y-b)<0) break; if (qpos[x][y-b] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x; qns[cons][3] = y-b; cons++; } } for (int c = 1; c <= r; c++){ // upper right diagonal if (((x+c)>n-1) || ((y-c)<0)) break; if (qpos[x-c][y-c] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-c; qns[cons][3] = y-c; cons++; } } for (int d = 1; d <= r; d++){ // right horizontal if ((x+d)>n-1) break; if (qpos[x-d][y] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-d; qns[cons][3] = y; cons++; } } for (int e = 1; e <= r; e++){ // lower right diagonal if (((x+e)>n-1) || ((y+e)>n-1)) break; if (qpos[x-e][y-e] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-e; qns[cons][3] = y-e; cons++; } } for (int f = 1; f <= r; f++){ // lower vertical if ((y+f)>n-1) break; if (qpos[x][y-f] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x; qns[cons][3] = y-f; cons++; } } for (int g = 1; g <= r; g++){ // lower left diagonal if (((x-g)<0) || ((y+g)>(n-1))) break; if (qpos[x-g][y-g] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-g; qns[cons][3] = y-g; cons++; } } for (int h = 1; h <= r; h++){ // left horizontal if ((x-h)<0) break; if (qpos[x-h][y] == 1){ qns[cons][0] = x; qns[cons][1] = y; qns[cons][2] = x-h; qns[cons][3] = y; cons++; } } return cons; } bool isQueenFight(int x1, int y1, int x2, int y2, int r){ int dx = x1 - x2; int dy = y1 - y2; if (r >= abs(dx) || r >= abs(dy)){ if (abs(dx) == abs(dy)){ return true; } if (dx == 0 || dy == 0){ return true; } } return false; } void scoreBoard(){ long score = 0; long connections = 0; for (int s = 0;s < n;s++){ for (int m = 0; m < n;m++){ if (qpos[s][m] == 1){ score += qnsr[s][m]; connections = checkConnections(k,m); } } } /* cout << "Score: " << score << endl; cout << "Connections: " << connections << endl; for(int q = 0; q < connections; q++){ cout <<"("<> n >> r >> k; for (int d = 0; d < n; d++){ getline(fReader, line); istringstream iss(line); for (int c = 0; c < n; c++){ iss >> gb[d][c]; } } } /* cout << "N=" << n << "; R=" << r << "; K=" << k << ";" << endl; for (int d = 0; d < n; d++){ for (int c = 0; c < n; c++){ cout << setw(2) << gb[d][c] << " "; } cout << endl; }/**/ for (int g = 0; g < n; g++){ for (int h = 0; h < n; h++){ qnsr[g][h] = evaluateQueen(gb,g,h,n,r); } } /* cout << endl; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ cout << setw(5) << qnsr[i][j] << " "; } cout << endl; }/**/ //cout << "Queen score: " << evaluateQueen(gb,3,2,n,r) << endl; int cntr = 0; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ gbs[cntr][0] = qnsr[i][j]; gbs[cntr][1] = i; gbs[cntr][2] = j; cntr++; } } /* cout << endl; for (int i = 0; i < (n*n); i++){ cout << gbs[i][0] << "(" < gbs[l-1][0]){ swp[0] = gbs[l][0]; swp[1] = gbs[l][1]; swp[2] = gbs[l][2]; gbs[l][0] = gbs[l-1][0]; gbs[l][1] = gbs[l-1][1]; gbs[l][2] = gbs[l-1][2]; gbs[l-1][0] = swp[0]; gbs[l-1][1] = swp[1]; gbs[l-1][2] = swp[2]; cntr++; } } }while(cntr>0); battle(0); ofstream fWriter; fWriter.open ("queens.out"); for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ if (qpos[i][j] == 1){ fWriter << i+1 << " " << j+1 << endl; } } } fWriter.close(); return 0;