模拟题,很巧妙的一种思路,看题越想越复杂,膜拜远古神犇
有且仅有一条回路,每行每列都需要偶数个拐弯,且两两相邻组对
找到每行相邻的两个,然后相连
同理,找到每列相邻的两个,然后相连
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
typedef long long LL;
const LL maxn=1e3;
LL n,m;
LL ls[maxn][maxn],lx[maxn][maxn];
char s[maxn][maxn];
int main(){
scanf("%lld%lld",&n,&m);
for(LL i=1;i<=n;++i)
scanf(" %s",s[i]+1);
for(LL i=1;i<=n;++i){
LL tmp=0,lst;
for(LL j=1;j<=m;++j){
if(s[i][j]=='T'){
++tmp;
if(tmp==1)
lst=j;
else{
tmp=0;
for(LL k=lst;k<j;++k)
ls[i][k]=1;
}
}
}
}
for(LL j=1;j<=m;++j){
LL tmp=0,lst;
for(LL i=1;i<=n;++i){
if(s[i][j]=='T'){
++tmp;
if(tmp==1)
lst=i;
else{
tmp=0;
for(LL k=lst;k<i;++k)
lx[k][j]=1;
}
}
}
}
for(LL i=1;i<2*n;++i){
if(i&1){
LL now=(i+1)>>1;
for(LL j=1;j<=m;++j){
printf("o");
if(ls[now][j])
printf("-");
else
printf(" ");
}
puts("");
}else{
LL now=i>>1;
for(LL j=1;j<=m;++j){
if(lx[now][j])
printf("| ");
else
printf(" ");
}
puts("");
}
}
return 0;
}