#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;
const int N = 2000 * 2000 + 5;
char a[2005][2005];
vector <int> e[N];
int n , m , in[N];
gp_hash_table < int , pair <int , int> > id;
int getid (int x , int y)
{
return (x - 1) * m + y;
}
int st[N] , top;
signed main ()
{
// freopen ("cars.in" , "r" , stdin);
// freopen ("cars.out" , "w" , stdout);
ios::sync_with_stdio (false);
cin.tie (0); cout.tie (0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (a[i][j] == '.') continue;
id[getid (i , j)] = make_pair (i , j);
if (a[i][j] == 'E')
{
for (int k = j + 1; k <= m; k++)
if (a[i][k] != '.') e[getid (i , k)].push_back (getid (i , j)) , in[getid (i , j)]++;
}
else if (a[i][j] == 'W')
{
for (int k = j - 1; k >= 1; k--)
if (a[i][k] != '.') e[getid (i , k)].push_back (getid (i , j)) , in[getid (i , j)]++;
}
else if (a[i][j] == 'N')
{
for (int k = i - 1; k >= 1; k--)
if (a[k][j] != '.') e[getid (k , j)].push_back (getid (i , j)) , in[getid (i , j)]++;
}
else if (a[i][j] == 'S')
{
for (int k = i + 1; k <= n; k++)
if (a[k][j] != '.') e[getid (k , j)].push_back (getid (i , j)) , in[getid (i , j)]++;
}
}
}
for (int i = 1; i <= n * m; i++)
{
// cout << in[i] << "\n";
if (id[i].first && in[i] == 0) st[++top] = i;
}
while (top)
{
int u = st[top]; top--;
cout << "(" << id[u].first - 1 << "," << id[u].second - 1 << ")" << "\n";
for (int i = 0; i < e[u].size (); i++)
{
int v = e[u][i];
if ((--in[v]) == 0) st[++top] = v;
}
}
return 0;
}
莫名MLE ,就很离谱