题意描述起来略麻烦,就不说了。模拟题。
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; }