#include <stdio.h> #include <stdlib.h> int main() { int n; scanf("%d", &n); // 动态分配棋盘内存 int **board = (int **)malloc(n * sizeof(int *)); for (int i = 0; i < n; i++) { board[i] = (int *)malloc(n * sizeof(int)); } // 读取棋盘数据 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &board[i][j]); } } int q; scanf("%d", &q); // 动态分配查询内存 int **ask = (int **)malloc(q * sizeof(int *)); for (int i = 0; i < q; i++) { ask[i] = (int *)malloc(4 * sizeof(int)); } // 读取查询 for (int i = 0; i < q; i++) { for (int j = 0; j < 4; j++) { scanf("%d", &ask[i][j]); } } // 处理每个查询 for (int i = 0; i < q; i++) { // 将1-based坐标转换为0-based int x1 = ask[i][0] - 1; int y1 = ask[i][1] - 1; int x2 = ask[i][2] - 1; int y2 = ask[i][3] - 1; int x = x1; int y = y1; while (1) { int cell = board[x][y]; // 获取当前位置的值 if (cell == 0) { // 向下移动:检查下一步是否超出下边界 if (x + 1 <= x2) { x++; // 仍在子矩阵内,移动 } else { // 下一步超出边界,输出当前位置(1-based) printf("%d %d\n", x + 1, y + 1); break; } } else if (cell == 1) { // 向右移动:检查下一步是否超出右边界 if (y + 1 <= y2) { y++; // 仍在子矩阵内,移动 } else { // 下一步超出边界,输出当前位置(1-based) printf("%d %d\n", x + 1, y + 1); break; } } } } // 释放内存 for (int i = 0; i < n; i++) { free(board[i]); } free(board); for (int i = 0; i < q; i++) { free(ask[i]); } free(ask); return 0; }