#include
using namespace std;
//每个点都有两种走法:在有路的情况下,向右(i,j+1),向下(i+1,j),到(n-1,m-1)成功
//用数组来记录路径
vector> route;
vector> temp_path;
vector> best_path;
void dfs(int i,int j,int n,int m){
//处理走不通的情况:数组越界;碰到墙壁或者已经走过
if(in-1||jm-1||route[i][j]==1){
return;
}
route[i][j]=1;//标记该位置已走过
temp_path.push_back({i,j});
if(i==n-1&&j==m-1){
/*有多条路径时最小的temp_path则为best_path,
但该题中只有唯一路径,因此可以直接将best等于temp
if(temp_path.size()<best_path.size()||best_path.empty())
best_path=temp_path;
*/
best_path=temp_path;
}
dfs(i-1,j,n,m);//上
dfs(i+1,j,n,m);//下
dfs(i,j-1,n,m);//左
dfs(i,j+1,n,m);//右
//如果能成功的话到这一步为止就会跳出去,因为走不通所以会运行到下面
route[i][j]=0;//该节点走不通时,在回溯中要恢复成原来的状态
temp_path.pop_back();//从路径中删除该节点
}
int main() {
int n,m;
while(cin>>n>>m){
route=vector>(n,vector(m,0));//设置地图大小并初始化
//一次测试多个案例依次输入,每个案例执行完后将容器清空
best_path.clear();
temp_path.clear();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>route[i][j];
}
}
dfs(0,0,n,m);
vector>:: iterator it;
for(it=best_path.begin();it!=best_path.end();it++)
cout<<'('<<(*it)[0]<<','<<(*it)[1]<<')'<<endl;
}
return 0;
}
// 64 位输出请用 printf("%lld")