2011ACM 成都现场 I题

哎 自己真是弱爆了,模拟题都搞不定。。

少了一个语句,回来加上就A了哭

太遗憾了


#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace  std;

int N,M;
char W[55][55];
int mask[5000][2],nmask;

char Result[5000];
set<string> dic;
vector<string> stringR;
vector<string> best;

int cmp(const void *a,const void *b)
{
	if(((int*)a)[0] == ((int*)b)[0])
		return ((int*)a)[1] - ((int*)b)[1];
	return ((int*)a)[0] - ((int*)b)[0];
}


void rota()
{
	int i;
	for (i=0;i<nmask;++i)
	{
		int a,b;
		a=mask[i][0];
		b=mask[i][1];

		mask[i][0]=b;
		mask[i][1]=N-1-a;
	}
	qsort(mask,nmask,sizeof(mask[0]),cmp);
}

bool isLeg()
{
	int i;
	for (i=0;i<stringR.size();++i)
	{
		if (dic.find(stringR[i])==dic.end())
		{
			return false;
		}
	}
	return true;
}

void getstring()
{
	int i;
	memset(Result,0,sizeof(Result));

	for (i=0;i<nmask;++i)
	{
		Result[i]=W[mask[i][0]][mask[i][1]];
	}
	rota();
	for (i=0;i<nmask;++i)
	{
		Result[i+nmask]=W[mask[i][0]][mask[i][1]];
	}
	rota();
	for (i=0;i<nmask;++i)
	{
		Result[i+2*nmask]=W[mask[i][0]][mask[i][1]];
	}
	rota();
	for (i=0;i<nmask;++i)
	{
		Result[i+3*nmask]=W[mask[i][0]][mask[i][1]];
	}

	//printf("%s\n",Result);

	string s="";
	stringR.clear();

	for (i=0;i<4*nmask;++i)
	{
		if (Result[i]=='.')
		{
			if (s!="")
			{
				stringR.push_back(s);
				s="";
			}
		}else
			s+=Result[i];
	}

	if (s!="")
	{
		stringR.push_back(s);
	}
}


bool isbetter()
{
	int i;

	if (best.size()==0 && stringR.size()!=0) return true;
	for (i=0;i<stringR.size() && i<best.size() ;++i)
	{
		if (stringR[i]<best[i]) return true;//就是少了 这一句啊!!!!结束后两分钟发现了
		if (stringR[i]>best[i]) return false;
	}

	if (stringR.size() <best.size())
	{
		return true;
	}
	return false;
}

void work()
{
	getstring();
	if(isLeg())
	{
		best=stringR;
	}

	rota();
	rota();
	getstring();
	if(isLeg())
	{
		if (isbetter())	best=stringR;
	}
	rota();
	rota();
	getstring();
	if(isLeg())
	{
		if (isbetter())	best=stringR;
	}
	rota();
	rota();
	getstring();
	if(isLeg())
	{
		if (isbetter())	best=stringR;
	}

}

int main()
{
	int T,i,j,k,t,nDic;

	cin>>T;

	for (t=1;t<=T;++t)
	{
		cin>>N;
		for (i=0;i<N;++i)
		{
			for (j=0;j<N;++j)
			{
				cin>>W[i][j];
			}
		}
		nmask=0;
		for (i=0;i<N;++i)
		{
			for (j=0;j<N;++j)
			{
				char  c;
				cin>>c;
				if (c=='*')
				{
					mask[nmask][0]=i;
					mask[nmask][1]=j;
					nmask++;
				}
			}
		}

		cin>>nDic;
		dic.clear();
		for (i=0;i<nDic;++i)
		{
			string s;
			cin>>s;
			dic.insert(s);
		}

		best.clear();
		work();

		cout<<"Case #"<<t<<":";
		if (best.size()==0)
		{
			cout<<" FAIL TO DECRYPT"<<endl;
		}else
		{
			for (i=0;i<best.size();++i)
			{
				cout<<" "<<best[i];
			}
			cout<<endl;
		}
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值