现在的位置: 首页 > 综合 > 正文

HDU 4119

2019年02月10日 ⁄ 综合 ⁄ 共 2484字 ⁄ 字号 评论关闭

题意描述起来略麻烦,就不说了。模拟题。

WA了一个下午。。。。当时都有点想放弃了。总的来说 还是很爽的

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct dian{
	int r,c;
}point[100005];
char dic[105][25];
struct final{
	char data[100005];
	int num;
}sorted[10];
bool cmpsorted(final a,final b)
{
	return strcmp(a.data,b.data)<0;
}
bool cmp(dian a,dian b)
{
	if(a.r!=b.r)
		return a.r<b.r;
	else
		return a.c<b.c;
}
int main()
{
//	freopen("11.txt","rt",stdin);
//	freopen("out.txt","wt",stdout);
	int t,cas=1;
	scanf("%d",&t);
    while(t--)
	{
		int n,i,j,k;
		for(i=0;i<4;i++)
		{	sorted[i].data[0]='\0';  sorted[i].num=i ; }
		scanf("%d",&n);
		getchar();
		char map[55][55];
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				scanf("%c",&map[i][j]);
				if(map[i][j]=='.')
					map[i][j]=' ';
			}
			getchar();
		}
		int pointnum=0;
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				char c=getchar();
				if(c=='*')
				{  point[pointnum].r=i; point[pointnum++].c=j ; }
			}
			getchar();
		}
		int dicnum;
		scanf("%d",&dicnum);
		for(i=0;i<dicnum;i++)
			scanf("%s",dic[i]);
		char rec[5][100005];
		for(k=0;k<4;k++)
		{
			int len=0;
			for(j=0;j<4;j++)
			{
				for(i=0;i<pointnum;i++)
				{
					rec[k][len++]=map[point[i].r][point[i].c];
					int t=point[i].r;
					point[i].r=point[i].c;
					point[i].c=n-1-t;
				}
				sort(point,point+pointnum,cmp);
			}
			rec[k][len]='\0';
			for(i=0;i<pointnum;i++){
				int t=point[i].r;
				point[i].r=point[i].c;
				point[i].c=n-1-t;
			}
			sort(point,point+pointnum,cmp);
		}
		//	for(i=0;i<4;i++)
		//		printf("%s\n",rec[i]); 
		int legal[10];
		for(i=0;i<4;i++)
			legal[i]=1;
		for(i=0;i<4;i++)
		{
			int begin=0,last;
			int len=strlen(rec[i]);//也可以在rec[i]的后面加一个空格字符,这样后面可以统一处理
			for(j=0;j<len;j++)
			{
				if(j==len-1&&rec[i][j]!=' ')//一开始WA的原因是写了句if(j==len-1||rec[i][j]==' ')本来想
				{                             //处理最后一位的,后来发现如果最后一位是空格的话,在sorted里面会多记录一个空格
					last=j;
					if(begin<=last)
					{
						char temp[10005];
						int lt=0;
						for(k=begin;k<=last;k++)
							temp[lt++]=rec[i][k];
						temp[lt]='\0';
						int x=strlen(sorted[i].data);
						if(!x)
							strcat(sorted[i].data,temp);
						else
						{
							sorted[i].data[x]=' ';
							sorted[i].data[x+1]='\0';
							strcat(sorted[i].data,temp);
						}
						int found=0;
						for(k=0;k<dicnum;k++){
							if(strcmp(dic[k],temp)==0)
								found=1;
						}
						if(!found)
						{	legal[i]=0; break; }
					}
				}
				else if(rec[i][j]==' ')
				{
					last=j-1;
					if(begin<=last)
					{
						char temp[10005];
						int lt=0;
						for(k=begin;k<=last;k++)
							temp[lt++]=rec[i][k];
						temp[lt]='\0';
						int x=strlen(sorted[i].data);
						if(!x)
							strcat(sorted[i].data,temp);
						else
						{
							sorted[i].data[x]=' ';
							sorted[i].data[x+1]='\0';
							strcat(sorted[i].data,temp);
						}
						int found=0;
						for(k=0;k<dicnum;k++){
							if(strcmp(dic[k],temp)==0)
								found=1;
						}
						if(!found)
						{	legal[i]=0; break; }
					}
					begin=j+1;
				}
			}
		}//for
		sort(sorted,sorted+4,cmpsorted);
		int is_print=0;
		printf("Case #%d: ",cas++);
		for(i=0;i<4;i++)
		{
			if(legal[sorted[i].num]&&strlen(sorted[i].data))
			{
				printf("%s\n",sorted[i].data);
				is_print=1;
				break;
			}
		}
		if(!is_print)
			printf("FAIL TO DECRYPT\n");
	}
	return 0;
}

抱歉!评论已关闭.