frameup.cpp

来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 126 行

CPP
126
字号
/*
ID: dd.ener1
PROG: frameup
LANG: C++
*/

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

char s[100][100];
char v[100][100];
int H,W;
int Up[26],Left[26],Down[26],Right[26];
bool Cover[26][26];
bool in[26];
int edge[26];
int N;
int S[26];
string res[100000];
int R;

void input(){
	freopen("frameup.in","r",stdin);
	scanf("%d %d\n",&H,&W);
	for(int i=0;i<H;++i)
		scanf("%s\n",s[i]);
}
void analysis(){
	for(int i=0;i<26;++i){
		Up[i]=Left[i]=1000;
		Down[i]=Right[i]=-1;
	}
	for(int i=0;i<H;++i)
		for(int j=0;j<W;++j){
			if(s[i][j]=='.'){
				s[i][j]=-1;
				continue;
			}
			s[i][j]-='A';
			in[s[i][j]]=true;
			if(i<Up[s[i][j]])Up[s[i][j]]=i;
			else if(i>Down[s[i][j]])Down[s[i][j]]=i;
			if(j<Left[s[i][j]])Left[s[i][j]]=j;
			else if(j>Right[s[i][j]])Right[s[i][j]]=j;
		}
	for(int i=0;i<26;++i)
		if(in[i])++N;
}
void put(int k){
	for(int i=Up[k];i<=Down[k];++i){
		v[i][Left[k]]=k;
		v[i][Right[k]]=k;
	}
	for(int i=Left[k];i<=Right[k];++i){
		v[Up[k]][i]=k;
		v[Down[k]][i]=k;
	}
}
void buildgraph(){
	for(int k=0;k<26;++k){
		if(!in[k])continue;
		for(int i=Up[k];i<=Down[k];++i){
			if(s[i][Left[k]]!=k)
				Cover[s[i][Left[k]]][k]=true;
			if(s[i][Right[k]]!=k)
				Cover[s[i][Right[k]]][k]=true;
		}
		for(int i=Left[k];i<=Right[k];++i){
			if(s[Up[k]][i]!=k)
				Cover[s[Up[k]][i]][k]=true;
			if(s[Down[k]][i]!=k)
				Cover[s[Down[k]][i]][k]=true;
		}
	}
	for(int i=0;i<26;++i){
		edge[i]=0;
		for(int j=0;j<26;++j)
			if(Cover[i][j])++edge[i];
	}
}
bool correct(){
	for(int i=0;i<H;++i)
		for(int j=0;j<W;++j)
			if(v[i][j]!=s[i][j])return false;
	return true;
}
void addres(){
	string str;
	for(int i=0;i<N;++i)
		str+=('A'+S[i]);
	res[R++]=str;
}
void topo(int k){
	if(k==N){
		addres();
		return;
	}
	for(int i=0;i<26;++i){
		if(!in[i])continue;
		if(edge[i])continue;
		S[k]=i;
		in[i]=false;
		for(int j=0;j<26;++j)
			if(Cover[j][i])--edge[j];
		topo(k+1);
		for(int j=0;j<26;++j)
			if(Cover[j][i])++edge[j];
		in[i]=true;
	}
}
void output(){
	freopen("frameup.out","w",stdout);
	for(int i=0;i<R;++i)
		puts(res[i].c_str());
}
int main(){
	//freopen("frameup.log","w",stdout);
	input();
	analysis();
	buildgraph();
	topo(0);
	output();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?