#include using namespace std; //高速化 struct ponjuice{ponjuice(){cin.tie(0);ios::sync_with_stdio(0);cout<= 0; i--) #define per2(i, n) for(ll i = n-1; i >= 0; i--) #define per3(i, a, b) for(ll i = b-1; i >= a; i--) #define per4(i, a, b, step) for(ll i = b-1; i >= a; i-= step) #define per(...) overload4(__VA_ARGS__, per4, per3, per2, per1)(__VA_ARGS__) //関数 #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() templateinline bool chmax(S& a, T b){return a < b && ( a = b , true);} templateinline bool chmin(S& a, T b){return a > b && ( a = b , true);} //定数 constexpr ll mod = 998244353; constexpr ll minf=-(1<<29); constexpr ll inf=(1<<29); constexpr ll MINF=-(1LL<<60); constexpr ll INF=(1LL<<60); const int dx[4] ={-1, 0, 1, 0}; const int dy[4] ={ 0, 1, 0,-1}; const int dx8[8] ={-1,-1,-1, 0, 1, 1, 1, 0}; const int dy8[8] ={-1, 0, 1, 1, 1, 0,-1,-1}; void solve(); int main() { int t = 1; // cin >> t; while(t--)solve(); } int a(int i, int j) { cout << "? " << i+1 << " " << j+1 << endl; int x; cin >> x; return x; } void solve(){ int n; cin >> n; vector> ans(n, vector(n, 0)); ans[0][0] = a(0, 0)-1; rep(i,0,n-1) { ans[i][i+1] = a(i, i+1)-1; } vector v(n),h(n); set sw; rep(i,0,n) sw.insert(i); if(ans[0][0] / n == ans[0][1] / n) { rep(i,0,n-1) { v[i] = ans[i][i+1] / n; sw.erase(v[i]); } h[0] = ans[0][0] % n; rep(i,1,n) { h[i] = ans[i-1][i] % n; } v[n-1] = *sw.begin(); rep(i,0,n) v[i] *= n; }else { rep(i,0,n-1) { v[i] = ans[i][i+1] % n; sw.erase(v[i]); } h[0] = ans[0][0] / n; rep(i,1,n) { h[i] = ans[i-1][i] / n; } v[n-1] = *sw.begin(); rep(i,0,n) h[i] *= n; } cout << "!" << endl; rep(i,0,n) { rep(j,0,n) { cout << v[i]+h[j]+1 << " "; } cout << endl; } }