Submission #1222815

#TimeUsernameProblemLanguageResultExecution timeMemory
1222815overwatch9Light Bulbs (EGOI24_lightbulbs)C++20
22 / 100
617 ms456 KiB
#include <bits/stdc++.h>
using namespace std;
int n;
vector <vector <char>> query, actual;
void print_query() {
    cout << "?" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << query[i][j];
        cout << endl;
    }
}
void reset() {
    for (int i = 0; i < n; i++)
        fill(query[i].begin(), query[i].end(), '0');
}
void print_ans(char x) {
    cout << "!" << endl;
    vector <vector <char>> ans(n+5, vector <char> (n+5, '0'));
    if (x == 'V') {
        for (int j = 0; j < n; j++) {
            for (int i = 0; i < n; i++) {
                if (actual[i][j] == 'V') {
                    ans[i][j] = '1';
                    break;
                }
            }
        }
    } else {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (actual[i][j] == 'H') {
                    ans[i][j] = '1';
                    break;
                }
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << ans[i][j];
        cout << endl;
    }

}
int main() {
    cin >> n;
    int cur = 0;
    actual = query = vector <vector <char>> (n+5, vector <char> (n+5, '0'));
    query[0][0] = '1';
    query[n-1][0] = '1';
    print_query();
    cin >> cur;
    if (cur == n) {
        // both vertical
        actual[0][0] = actual[n-1][0] = 'V';
    } else if (cur == n * 2) {
        // both horizontal
        actual[0][0] = actual[n-1][0] = 'H';
    }

    if (actual[0][0] == 'H') {
        for (int i = 1; i < n-1; i++) {
            reset();
            query[0][0] = query[i][0] = '1';
            print_query();
            int res;
            cin >> res;
            if (res == 2 * n)
                actual[i][0] = 'H';
            else
                actual[i][0] = 'V';
        }
    } else if (actual[0][0] == 'V') {
        for (int i = 1; i < n-1; i++) {
            reset();
            query[0][0] = query[i][0] = '1';
            print_query();
            int res;
            cin >> res;
            if (res == n)
                actual[i][0] = 'V';
            else
                actual[i][0] = 'H';
        }
    } else {
        
        for (int i = 1; i < n-1; i++) {
            reset();
            query[0][0] = query[n-1][0] = query[i][0] = '1';
            print_query();
            int res;
            cin >> res;
            if (res > cur)
                actual[i][0] = 'H';
            else
                actual[i][0] = 'V';
        }
    }

    reset();

    if (actual[0][0] == '0') {
        query[0][0] = query[1][0] = '1';
        print_query();
        cin >> cur;
        if (actual[1][0] == 'H') {
            if (cur == 2 * n) {
                actual[0][0] = 'H';
                actual[n-1][0] = 'V';
            } else {
                actual[0][0] = 'V';
                actual[n-1][0] = 'H';
            }
        } else {
            if (cur == n) {
                actual[0][0] = 'V';
                actual[n-1][0] = 'H';
            } else {
                actual[0][0] = 'H';
                actual[n-1][0] = 'V';
            }
        }
    }

    for (int i = 0; i < n; i++) {
        for (int j = 1; j < n; j++) {
            reset();
            query[i][0] = query[i][j] = '1';
            print_query();
            int res;
            cin >> res;
            if (actual[i][0] == 'H') {
                if (res == n)
                    actual[i][j] = 'H';
                else
                    actual[i][j] = 'V';
            } else {
                if (res == 2 * n)   
                    actual[i][j] = 'V';
                else
                    actual[i][j] = 'H';
            }
        }
    }

    bool verts = true;
    for (int j = 0; j < n; j++) {
        bool found = false;
        for (int i = 0; i < n; i++) {
            if (actual[i][j] == 'V')
                found = true;
        }
        if (!found) {
            verts = false;
            break;
        }
    }

    if (verts)
        print_ans('V');
    else
        print_ans('H');

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...