Коптеры
Код:
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, ccount = 0, mmove = 5;
vector<int> mem(8);
void vivod() {
mem[5] = ccount + 1;
if (mem[5] >= 120) {
mem[5] = 120;
}
cout << mmove << endl;
for (int i = 0; i < 8; i++) {
if (i != 5) mem[i] += 128;
cout << mem[i] << " ";
}
cin >> n;
}
int main()
{
//vhodnie dannie
cin >> n;
vector<pair<int, int>> figura(n);
for (int i = 0; i < n; i++) cin >> figura[i].second >> figura[i].first;
for (int i = 0; i < 8; i++) {
cin >> mem[i];
if (i != 5 && mem[i] != 0) mem[i] -= 128;
}
cin >> m;
vector<vector<int>> mems(m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < 9; j++) {
int x;
cin >> x;
mems[i].push_back(x);
if (mems[i][j] != 0 && j != 0 && j != 6) mems[i][j] -= 128;
}
}
//obrabotka dannih
sort(figura.begin(), figura.end());
int minusX = figura[0].second, minusY = figura[0].first;
for (int i = 0; i < n; i++) {
figura[i].second -= minusX;
figura[i].first -= minusY;
}
ccount = mem[5];
//opredelyaem tochky otscheta i koordinati
if (mem[2] == 0 || mem[2] == 3 || mem[2] == 4) {
//esli mojem, polychaem koordinati
for (int i = 0; i < m; i++) {
if (mems[i][3] == 1 || mems[i][3] == 2) {
if (mems[i][0] == 1) {
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
else if (mems[i][0] == 2) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
else if (mems[i][0] == 3) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
else if (mems[i][0] == 4) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
mem[2] = 1;
mem[0] = mem[1];
mem[4] = mem[3];
mem[7] = 1;
vivod();
return 0;
}
}
bool iOsobenniy = true;
for (int i = 0; i < m; i++) {
if (mems[i][0] == 1 || mems[i][0] == 4) {
iOsobenniy = false;
break;
}
}
if (iOsobenniy) {
if (mem[2] == 0) {
mem[2] = 3;
}
else {
mem[2] = 4;
for (int i = 0; i < m; i++) {
if (mems[i][2] != 0 || mems[i][4] != 0 || mems[i][3] == 3) {
if (mems[i][0] == 1) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] + 1 > mem[1]){
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 2) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] - 1 > mem[1]) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 3) {
if (mems[i][4] - 1 > mem[3] || mems[i][4] - 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
}
else if (mems[i][0] == 4) {
if (mems[i][4] + 1 > mem[3] || mems[i][4] + 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
}
}
}
if (mem[1] == 0 && mem[3] == 0 && ccount >= 22) {
mem[2] = 2;
}
}
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][2] != 0 || mems[i][4] != 0 || mems[i][3] == 3) {
if (mems[i][0] == 1) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] + 1 > mem[1]) {
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 2) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] - 1 > mem[1]) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 3) {
if (mems[i][4] - 1 > mem[3] || mems[i][4] - 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
}
else if (mems[i][0] == 4) {
if (mems[i][4] + 1 > mem[3] || mems[i][4] + 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
}
}
}
}
}
else if (mem[2] == 1 && ccount >= 44) {
int kydaX = figura[mem[7]].second, kydaY = figura[mem[7]].first;
int vlevo = mem[0] - kydaX, vniz = mem[4] - kydaY;
//esli priletel
if (abs(vlevo) + abs(vniz) == 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 5 && mems[i][8] == mem[7]) {
if (mems[i][4] < mem[3] || mems[i][4] == mem[3] && mems[i][2] < mem[1]) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
}
mem[2] = 2;
}
//pri podlete
else if (abs(vlevo) + abs(vniz) == 1) {
if (vlevo != 0) {
if (vlevo > 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 1 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 1;
mem[0]--;
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 2 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 2;
mem[0]++;
}
}
else {
if (vniz > 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 4 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 4;
mem[4]--;
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 3 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 3;
mem[4]++;
}
}
}
//esli daleko letet
else {
if (vlevo != 0) {
if (vlevo > 0) {
mmove = 1;
mem[0]--;
}
else {
mmove = 2;
mem[0]++;
}
}
else {
if (vniz > 0) {
mmove = 4;
mem[4]--;
}
else {
mmove = 3;
mem[4]++;
}
}
}
}
//vivod dannih
vivod();
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, ccount = 0, mmove = 5;
vector<int> mem(8);
void vivod() {
mem[5] = ccount + 1;
if (mem[5] >= 120) {
mem[5] = 120;
}
cout << mmove << endl;
for (int i = 0; i < 8; i++) {
if (i != 5) mem[i] += 128;
cout << mem[i] << " ";
}
cin >> n;
}
int main()
{
//vhodnie dannie
cin >> n;
vector<pair<int, int>> figura(n);
for (int i = 0; i < n; i++) cin >> figura[i].second >> figura[i].first;
for (int i = 0; i < 8; i++) {
cin >> mem[i];
if (i != 5 && mem[i] != 0) mem[i] -= 128;
}
cin >> m;
vector<vector<int>> mems(m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < 9; j++) {
int x;
cin >> x;
mems[i].push_back(x);
if (mems[i][j] != 0 && j != 0 && j != 6) mems[i][j] -= 128;
}
}
//obrabotka dannih
sort(figura.begin(), figura.end());
int minusX = figura[0].second, minusY = figura[0].first;
for (int i = 0; i < n; i++) {
figura[i].second -= minusX;
figura[i].first -= minusY;
}
ccount = mem[5];
//opredelyaem tochky otscheta i koordinati
if (mem[2] == 0 || mem[2] == 3 || mem[2] == 4) {
//esli mojem, polychaem koordinati
for (int i = 0; i < m; i++) {
if (mems[i][3] == 1 || mems[i][3] == 2) {
if (mems[i][0] == 1) {
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
else if (mems[i][0] == 2) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
else if (mems[i][0] == 3) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
else if (mems[i][0] == 4) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
mem[2] = 1;
mem[0] = mem[1];
mem[4] = mem[3];
mem[7] = 1;
vivod();
return 0;
}
}
bool iOsobenniy = true;
for (int i = 0; i < m; i++) {
if (mems[i][0] == 1 || mems[i][0] == 4) {
iOsobenniy = false;
break;
}
}
if (iOsobenniy) {
if (mem[2] == 0) {
mem[2] = 3;
}
else {
mem[2] = 4;
for (int i = 0; i < m; i++) {
if (mems[i][2] != 0 || mems[i][4] != 0 || mems[i][3] == 3) {
if (mems[i][0] == 1) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] + 1 > mem[1]){
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 2) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] - 1 > mem[1]) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 3) {
if (mems[i][4] - 1 > mem[3] || mems[i][4] - 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
}
else if (mems[i][0] == 4) {
if (mems[i][4] + 1 > mem[3] || mems[i][4] + 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
}
}
}
if (mem[1] == 0 && mem[3] == 0 && ccount >= 22) {
mem[2] = 2;
}
}
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][2] != 0 || mems[i][4] != 0 || mems[i][3] == 3) {
if (mems[i][0] == 1) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] + 1 > mem[1]) {
mem[1] = mems[i][2] + 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 2) {
if (mems[i][4] > mem[3] || mems[i][4] == mem[3] && mems[i][2] - 1 > mem[1]) {
mem[1] = mems[i][2] - 1;
mem[3] = mems[i][4];
}
}
else if (mems[i][0] == 3) {
if (mems[i][4] - 1 > mem[3] || mems[i][4] - 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] - 1;
}
}
else if (mems[i][0] == 4) {
if (mems[i][4] + 1 > mem[3] || mems[i][4] + 1 == mem[3] && mems[i][2] > mem[1]) {
mem[1] = mems[i][2];
mem[3] = mems[i][4] + 1;
}
}
}
}
}
}
else if (mem[2] == 1 && ccount >= 44) {
int kydaX = figura[mem[7]].second, kydaY = figura[mem[7]].first;
int vlevo = mem[0] - kydaX, vniz = mem[4] - kydaY;
//esli priletel
if (abs(vlevo) + abs(vniz) == 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 5 && mems[i][8] == mem[7]) {
if (mems[i][4] < mem[3] || mems[i][4] == mem[3] && mems[i][2] < mem[1]) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
}
mem[2] = 2;
}
//pri podlete
else if (abs(vlevo) + abs(vniz) == 1) {
if (vlevo != 0) {
if (vlevo > 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 1 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 1;
mem[0]--;
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 2 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 2;
mem[0]++;
}
}
else {
if (vniz > 0) {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 4 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 4;
mem[4]--;
}
else {
for (int i = 0; i < m; i++) {
if (mems[i][0] == 3 && mems[i][3] == 2) {
mem[7]++;
if (mem[7] >= n) mem[7] = 1;
vivod();
return 0;
}
}
mmove = 3;
mem[4]++;
}
}
}
//esli daleko letet
else {
if (vlevo != 0) {
if (vlevo > 0) {
mmove = 1;
mem[0]--;
}
else {
mmove = 2;
mem[0]++;
}
}
else {
if (vniz > 0) {
mmove = 4;
mem[4]--;
}
else {
mmove = 3;
mem[4]++;
}
}
}
}
//vivod dannih
vivod();
return 0;
}