###C++ 270 264 260 256 253 char
C++ 270 264 260 256 253 char
#include<string>
#include<iostream>
#define X cin.getline(&l[1],C+2)
using namespace std;int main(){int r=0,c,R,C,a=0;cin>>R>>C;string l(C+2,35),o(l);X;for(;++r<=R;o=l)for(X,c=0;++c<=C;)if(l[c]!=35&&(l[c-1]==35||o[c]==35))printf("%d %d %d\n",++a,r,c);}
To use:
g++ cross.cpp -o cross
cat puzzle | cross
Nicely formatted:
#include<string>
#include<iostream>
// using this #define saved 1 char
#define X cin.getline(&l[1],C+2)
using namespace std;
int main()
{
int r=0,c,R,C,a=0;
cin>>R>>C;
string l(C+2,35),o(l);
X;
for(;++r<=R;o=l)
for(X,c=0;++c<=C;)
if(l[c]!=35&&(l[c-1]==35||o[c]==35))
printf("%d %d %d\n",++a,r,c);
}
I tried reading the whole crossword in one go and using a single loop.
But the cost of compensating for the '\n character outweighed any gains:
#include <iostream>
#include <string>
#define M cin.getline(&l[C+1],R*C
using namespace std;
int main()
{
int R,C,a=0,x=0;
cin>>R>>C;
string l(++R*++C,35);
M);M,0);
for(;++x<R*C;)
if ((l[x]+=l[x]==10?25:0)!=35&&(l[x-1]==35||l[x-C]==35))
printf("%d %d %d\n",++a,x/C,x%C);
}
Compressed: 260 chars
#include<iostream>
#include<string>
#define M cin.getline(&l[C+1],R*C
using namespace std;int main(){int R,C,a=0,x=0;cin>>R>>C;string l(++R*++C,35);M);M,0);for(;++x<R*C;)if((l[x]+=l[x]==10?25:0)!=35&&(l[x-1]==35||l[x-C]==35))printf("%d %d %d\n",++a,x/C,x%C);}