HDU 4119 Isabella's Message(模拟)

这个题目写的有点烦人,总感觉题目没有说清楚,不知道按照字典序是包含头尾空格还是重复空格,后来注意到输出没有多余空格

才去除掉所有多余空格的,总之这个题目在现场的时候敢花时间在这个题目上就能过!

我是按照坐标排序来做的,坐标旋转90度的话(x,y)变成(y,n-y)这里下标从1开始的,n是矩阵维数,也就是第i列变成第i行

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <string>
#include <set>
#include <map>
using namespace std;
#define maxn 200
char message[maxn][maxn];
char mask[maxn][maxn];
struct point{
    int x,y;
}po[maxn*maxn];
int n,m,pos;
map<string,int> g;
char str[maxn*maxn],msg1[maxn*maxn],msg2[maxn*maxn],msg3[maxn*maxn],msg4[maxn*maxn];
char now[maxn*maxn*4+10],ans[maxn*maxn*4+10];
bool cmp(const point &a,const point &b){
    if(a.x == b.x)
    return a.y < b.y;
    return a.x < b.x;
}
int main(){
    int i,j,k=0,t,temp,len;
    bool flag,ok;
    scanf("%d",&t);
    while(t--){
        ok=false;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        scanf("%s",message[i]+1);
        for(i=1;i<=n;i++)
        scanf("%s",mask[i]+1);
        g.clear();
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%s",str);
            g[str]=1;
        }
        pos=0;
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        if(mask[i][j]=='*')
        po[pos].x=i,po[pos++].y=j;
        sort(po,po+pos,cmp);
        for(i=0;i<pos;i++){
            if(message[po[i].x][po[i].y]=='.')
            msg1[i]=' ';
            else
            msg1[i]=message[po[i].x][po[i].y];
        }
        msg1[pos]=0;
        for(i=0;i<pos;i++)
            temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
        sort(po,po+pos,cmp);
        for(i=0;i<pos;i++){
            if(message[po[i].x][po[i].y]=='.')
            msg2[i]=' ';
            else
            msg2[i]=message[po[i].x][po[i].y];
        }
        msg2[pos]=0;
        for(i=0;i<pos;i++)
            temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
        sort(po,po+pos,cmp);
        for(i=0;i<pos;i++){
            if(message[po[i].x][po[i].y]=='.')
            msg3[i]=' ';
            else
            msg3[i]=message[po[i].x][po[i].y];
        }
        msg3[pos]=0;
        for(i=0;i<pos;i++)
            temp=po[i].x,po[i].x=po[i].y,po[i].y=n-temp+1;
        sort(po,po+pos,cmp);
        for(i=0;i<pos;i++){
            if(message[po[i].x][po[i].y]=='.')
            msg4[i]=' ';
            else
            msg4[i]=message[po[i].x][po[i].y];
        }
        msg4[pos]=0;
        //
        strcpy(now,msg1),strcpy(now+pos,msg2),strcpy(now+pos+pos,msg3),strcpy(now+pos+pos+pos,msg4);
        temp=pos*4;
        len=0;
        temp--;
        while(temp>=0 && now[temp]==' ') temp--;
        temp++;
        for(i=0;i<temp;i++)
        if(now[i]!=' ') break;
        for(i;i<temp;i++){
            if(now[i]!=' ')
            now[len++]=now[i];
            else if(now[i-1]!=' ') now[len++]=now[i];
        }
        now[len]=0;
        temp=len;
        len=0;
        flag=true;
        for(i=0;i<temp;i++){
            if(now[i]==' '){
                str[len]=0;
                len=0;
                if(g[str]==0) { flag=false;break;}
            }
            else str[len++]=now[i];
        }
        str[len]=0;
        if(g[str]==0) { flag=false;}
        if(flag) strcpy(ans,now),ok=true;
        //
        strcpy(now,msg2),strcpy(now+pos,msg3),strcpy(now+pos+pos,msg4),strcpy(now+pos+pos+pos,msg1);
        temp=pos*4;
        len=0;
        temp--;
        while(temp>=0 && now[temp]==' ') temp--;
        temp++;
        for(i=0;i<temp;i++)
        if(now[i]!=' ')break;
        for(i;i<temp;i++){
            if(now[i]!=' ')
            now[len++]=now[i];
            else if(now[i-1]!=' ') now[len++]=now[i];
        }
        now[len]=0;
        temp=len;
        len=0;
        flag=true;
        for(i=0;i<temp;i++){
            if(now[i]==' '){
                str[len]=0;
                len=0;
                if(g[str]==0) { flag=false;break;}
            }
            else str[len++]=now[i];
        }
        str[len]=0;
        if(g[str]==0) { flag=false;}
        if(flag==true && ok==false) strcpy(ans,now),ok=true;
        else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
        
        strcpy(now,msg3),strcpy(now+pos,msg4),strcpy(now+pos+pos,msg1),strcpy(now+pos+pos+pos,msg2);
        temp=pos*4;
        len=0;
        temp--;
        while(temp>=0 && now[temp]==' ') temp--;
        temp++;
        for(i=0;i<temp;i++)
        if(now[i]!=' ')break;
        for(i;i<temp;i++){
            if(now[i]!=' ')
            now[len++]=now[i];
            else if(now[i-1]!=' ') now[len++]=now[i];
        }
        now[len]=0;
        temp=len;
        len=0;
        flag=true;
        for(i=0;i<temp;i++){
            if(now[i]==' '){
                str[len]=0;
                len=0;
                if(g[str]==0) { flag=false;break;}
            }
            else str[len++]=now[i];
        }
        str[len]=0;
        if(g[str]==0) { flag=false;}
        if(flag==true && ok==false) strcpy(ans,now),ok=true;
        else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
        //
        strcpy(now,msg4),strcpy(now+pos,msg1),strcpy(now+pos+pos,msg2),strcpy(now+pos+pos+pos,msg3);
        temp=pos*4;
        len=0;
        temp--;
        while(temp>=0 && now[temp]==' ') temp--;
        temp++;
        for(i=0;i<temp;i++)
        if(now[i]!=' ')break;
        for(i;i<temp;i++){
            if(now[i]!=' ')
            now[len++]=now[i];
            else if(now[i-1]!=' ') now[len++]=now[i];
        }
        now[len]=0;
        temp=len;
        len=0;
        flag=true;
        for(i=0;i<temp;i++){
            if(now[i]==' '){
                str[len]=0;
                len=0;
                if(g[str]==0) { flag=false;break;}
            }
            else str[len++]=now[i];
        }
        str[len]=0;
        if(g[str]==0) { flag=false;}
        if(flag==true && ok==false) strcpy(ans,now),ok=true;
        else if(flag==true && strcmp(ans,now) > 0) strcpy(ans,now),ok=true;
        if(ok) printf("Case #%d: %s\n",++k,ans);
        else printf("Case #%d: FAIL TO DECRYPT\n",++k);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值