#include <iostream> #include <stack> using namespace std; struct node { int x, y; }; const int maxn = 255; int graph[maxn][maxn]; bool visited[maxn][maxn]; stack<node> st; void search(int xl, int yl, int xh, int yh, int val) { while(xl < xh && yl < yh) { if(graph[xl][yh] == val && !visited[xl][yh]) { node n; n.x = xl; n.y = yh; st.push(n); visited[xl][yh] = true; } else if(graph[xl][yh] > val) yh--; else xl++; if(graph[xh][yl] == val && !visited[xh][yl]) { node n; n.x = xh; n.y = yl; st.push(n); visited[xh][yl] = true; } if (graph[xh][yl] > val) xh--; else yl++; } } int main(void) { freopen("1.txt", "r", stdin); int m, n, i, j; memset(graph, 0, sizeof(graph)); memset(visited, false, sizeof(graph)); cin >> m >> n; for(i = 0; i < m; ++i) for(j = 0; j < n; ++j) cin >> graph[i][j]; search(0, 0, m-1, n-1, 5); while(!st.empty()) { node n = st.top(); st.pop(); cout << n.x << " " << n.y << endl; } return 0; }
复杂度为O(max(M,N))
附测试数据
5 5
1 2 3 4 5
3 7 8 9 11
5 9 10 17 18
7 12 15 19 23
9 13 16 20 25