最少需要n次, 按行每行或者案列每列放一个, 如果不能存在就无解
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <vector>
#define MAX 1005
#define INF 1e8
#define FOR(i, n) for(int i = 0; i < n; i++)
#define FORB(i, n) for(int i = n - 1; i >= 0; i--)
#define MKPR(i, j) make_pair(i, j)
using namespace std;
int n;
char s[MAX][MAX];
void solve(){
}
int main()
{
cin>>n;
getchar();
FOR(i, n){
gets(s[i]);
}
bool isFind = true;
vector<pair<int, int> >ans;
FOR(i, n){//每行放一个
isFind =false;
FOR(j, n){
if( s[i][j] != 'E'){
isFind = true;
ans.push_back( MKPR(i + 1, j + 1) );
break;
}
}
if(isFind == false){
ans.clear();
break;
}
}
if(isFind){
int tn = ans.size();
FOR(i, tn)cout<<ans[i].first<<" "<<ans[i].second<<endl;
return 0;
}
FOR(j, n){
isFind = false;
FOR(i, n){
if(s[i][j] != 'E'){
isFind = true;
// cout<<i + 1<<" "<<j + 1<<endl;
ans.push_back(MKPR(i + 1, j + 1));
break;
}
}
if(isFind == false)break;
}
cout<<endl;
if(isFind){
int tn = ans.size();
FOR(i, tn){
cout<<ans[i].first<<" "<<ans[i].second<<endl;
}
}else {
puts("-1");
}
return 0;
}