#include #include #include #include using namespace std; const int n = 100, m = 100, l = 50; char front[l][n][m]; int F, K; int stats[l][6]; int height = 0, width = 1, catsNumber = 2, catsPower = 3, bonus = 4, maxScore = 5; //stats array keys int totalCats = 0; struct cat { int front; int x; int y; int power; bool dead = false; }; cat cats[l][10000]; cat singles[l]; int catnum, frontnum = 0, sc = 0; //cats and singles indexes struct cnpf { //cats number per front int f; int cn; }; cnpf cnf[l]; ofstream doc("catsdogs.out"); ifstream in("catsdogs.in"); void fillArray() { int k, i, j; int N, M, B; //height and width of each front; bonus string s; in >> F >> K; for (k = 0; k < F; k++) { catnum = 0; in >> N >> M >> B; stats[k][height] = N; stats[k][width] = M; stats[k][bonus] = B; stats[k][catsPower] = 0; stats[k][catsNumber] = 0; cnf[k].f = k; cnf[k].cn = 0; frontnum++; for (i = 0; i < N; i++) { in >> s; for (j = 0; j < M; j++) { front[k][i][j] = s[j]; if (isdigit(s[j])) { cats[frontnum][catnum].front = k; cats[frontnum][catnum].x = i; cats[frontnum][catnum].y = j; cats[frontnum][catnum].power = s[j] - '0'; catnum++; stats[k][catsPower] += s[j] - '0'; stats[k][catsNumber] += 1; cnf[k].cn += 1; } } } totalCats += stats[k][catsNumber]; if (stats[k][catsNumber] == 1) { singles[sc] = cats[frontnum][catnum - 1]; sc++; } stats[k][maxScore] = 2 * stats[k][catsPower] + stats[k][bonus]; } } //acsending order bool sortByPower(cat i, cat j) { return i.power < j.power; } //descending bool sortByCN(cnpf i, cnpf j) { return i.cn > j.cn; } void dogsTurn() { int dog; for (dog = 0; dog < K; dog++) { if (sc > 0) { sc--; totalCats--; doc << singles[sc].front +1 << endl << singles[sc].x + 1 << " " << singles[sc].y + 1 << endl << "STAY " << endl; singles[sc].dead = true; } else { if (totalCats > 0) { int i, max, f = cnf[0].f; cat * bestCat = NULL; sort(cnf, cnf + l, sortByCN); int k = stats[f][catsNumber]; for (max = 0, i = 0; i < k; i++) { if (max < cats[f][i].power && !cats[f][i].dead) { max = cats[f][i].power; bestCat = &cats[f][i]; } if (bestCat == NULL) { doc << "0" << endl; break; } else { cnf[0].cn--; doc << f + 1 << endl << (*bestCat).x + 1 << " " << (*bestCat).y + 1 << endl; (*bestCat).dead = true; doc << "STAY" << endl; } } } else { doc << "0" << endl; } } } } int main() { fillArray(); sort(singles, singles + sc, sortByPower); dogsTurn(); doc.close(); return 0; }