P2407 [SDOI2009]地图复原

P2407 [SDOI2009]地图复原

模拟题,很巧妙的一种思路,看题越想越复杂,膜拜远古神犇

有且仅有一条回路,每行每列都需要偶数个拐弯,且两两相邻组对
找到每行相邻的两个,然后相连
同理,找到每列相邻的两个,然后相连

#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;
}
原文地址:https://www.cnblogs.com/y2823774827y/p/10212294.html