힌트 참조
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder bw = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int R = Integer.parseInt(st.nextToken());
int[][] S = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) S[i][j] = Integer.parseInt(st.nextToken());
}
ArrayList<Deque<Integer>> L = new ArrayList<>();
for (int k = 0; k < Math.min(N, M) / 2; k++) {
L.add(new LinkedList<>());
for (int j = k; j < M - k; j++) L.get(k).offer(S[k][j]);
for (int i = k + 1; i < N - k; i++) L.get(k).offer(S[i][M - k - 1]);
for (int j = M - k - 2; j >= k; j--) L.get(k).offer(S[N - k - 1][j]);
for (int i = N - k - 2; i > k; i--) L.get(k).offer(S[i][k]);
}
for (Deque<Integer> x : L)
for (int i = 0; i < R % x.size(); i++)
x.offer(x.poll());
for (int k = 0; k < Math.min(N, M) / 2; k++) {
for (int j = k; j < M - k; j++) S[k][j] = L.get(k).poll();
for (int i = k + 1; i < N - k; i++) S[i][M - k - 1] = L.get(k).poll();
for (int j = M - k - 2; j >= k; j--) S[N - k - 1][j] = L.get(k).poll();
for (int i = N - k - 2; i > k; i--) S[i][k]= L.get(k).poll();
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) bw.append(S[i][j]).append(" ");
bw.append("\n");
}
System.out.print(bw);
}
}