#include using namespace std; #ifdef TEMPURA #else #define debug(...) ((void)0) #define msg(...) ((void)0) #endif #define rep(i, n) for(int i = 0; i < (int)(n); i++) #define REP(i, m, n) for(int i = (int)(m); i < (int)(n); i++) using ll = long long; using ull = unsigned long long; using i128 = __int128_t; template inline bool chmin(T &a, T b) { if(a > b) { a = b; return true; } return false; } template inline bool chmax(T &a, T b) { if(a < b) { a = b; return true; } return false; } // #include // using mint = atcoder::modint998244353; int n; pair query(int x, int y) { cout << "? " << x + 1 << " " << y + 1 << endl; int v; cin >> v; --v; return {v / n, v % n}; } int main() { cin >> n; auto [x0, y0] = query(0, 0); auto [x1, y1] = query(0, 1); if(x0 == x1) { vector r(n), c(n); c[0] = x0; r[0] = y0; r[1] = y1; c[n - 1] = n * (n - 1) / 2 - x0; rep(i, n - 2) { auto [x, y] = query(i + 1, i + 2); c[i + 1] = x; c[n - 1] -= x; r[i + 2] = y; } debug(r, c); cout << "!" << endl; rep(i, n) { rep(j, n) cout << r[j] + c[i] * n + 1 << " "; cout << endl; } } else if(y0 == y1) { vector r(n), c(n); r[0] = y0; c[0] = x0; c[1] = x1; r[n - 1] = n * (n - 1) / 2 - y0; rep(i, n - 2) { auto [x, y] = query(i + 1, i + 2); r[i + 1] = y; r[n - 1] -= y; c[i + 2] = x; } cout << "!" << endl; rep(i, n) { rep(j, n) cout << r[i] + c[j] * n + 1 << " "; cout << endl; } } }