#include <cstdio> #include <cstring> #include <queue> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct Point1 { int x, y; Point1(int x,int y):x(x),y(y){}; Point1(){}; }; int m1[10][10]; Point1 m2[10][10]; vector<Point1> ans1; inline bool check(int m,int n,int y,int x) { if(0<=y&&0<=x&&y<m&&x<n) return true; return false; } void dfs(Point1 a1,int m,int n) { queue<Point1> q1; q1.push(a1); while(!q1.empty()) { Point1 tmp=q1.front();q1.pop(); int x=tmp.x,y=tmp.y; m1[y][x]=1; if(x==n-1&&y==m-1) break; if(check(m,n,y-1,x)&&m1[y-1][x]==0) { m2[y-1][x]=Point1(x,y); q1.push(Point1(x,y-1)); } if(check(m,n,y+1,x)&&m1[y+1][x]==0) { m2[y+1][x]=Point1(x,y); q1.push(Point1(x,y+1)); } if(check(m,n,y,x-1)&&m1[y][x-1]==0) { m2[y][x-1]=Point1(x,y); q1.push(Point1(x-1,y)); } if(check(m,n,y,x+1)&&m1[y][x+1]==0) { m2[y][x+1]=Point1(x,y); q1.push(Point1(x+1,y)); } } } void addList(Point1 a) { if(a.x==0&&a.y==0) { ans1.push_back(a); return; } ans1.push_back(a); addList(m2[a.y][a.x]); } //reverse //printf int main() { int m,n; while(cin>>m>>n) { ans1.clear(); for(int i=0;i<m;++i) for(int j=0;j<n;++j) cin>>m1[i][j]; dfs(Point1(0,0),m,n); addList(Point1(n-1,m-1)); reverse(ans1.begin(),ans1.end()); for(Point1 a:ans1) { printf("(%d,%d)\n",a.y,a.x); } } }