Reginal2011_Chengdu_I Isabella's Message

题目地址:2011_Chengdu_I

题目大意: 先给你一个矩阵,然后给你一个“mask”,里面n*n/4 个hole ,把它放在这个矩阵上,hole的地方会形成一个striing,现在把这个mask顺时针旋转90度,得到第二个string,然后。。直到得到4个string,但是不知道哪个打头,这样就有4中可能,需要一一枚举。


然后给你了一个单词表 ,我们放进一个set,用count查询。

得到每个可能的信息串后,要将它拆成一个个的单词,为了方斌拆分,在最后加一个’.‘  ;

刚刚开一个p[50][50]  会re  干脆数组都开大一点


代码比较长,模拟。。

代码:

#include<iostream>
#include<set>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cstdio>
using  namespace std;


char p[55][55];

bool hole[55][55];
bool hole1[55][55];
bool hole2[55][55];
bool hole3[55][55];

int x[1000];
int y[1000];

int x1[1000];
int y1[1000];

int x2[1000];
int y2[1000];

int x3[1000];
int y3[1000];


void init()
{
    memset(hole,0,sizeof(hole));
    memset(hole1,0,sizeof(hole1));
    memset(hole2,0,sizeof(hole2));
    memset(hole3,0,sizeof(hole3));
    
}

int main()
{
    
    int cas;
    cin>>cas;
    
    
    for(int l=0;l<cas;l++)
    {
        init();
        int index=0;
        set<string> vocabulary;
        
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            scanf("%s",p[i]);
        
        
        char ch;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                cin>>ch;
                if(ch=='*')
                {
                    x[index]=i;
                    y[index]=j;
                    index++;
                }
                
            }
        
        int  words_num;
        cin>>words_num;
        
        string s;
        
        
        for(int i=0;i<words_num;i++)
        {
            cin>>s;
            vocabulary.insert(s);
            
        }
        
        
        
        // 90
        
        for(int i=0;i<index;i++)
        {
            x1[i]=y[i];
            y1[i]=n-1-x[i];
            
        }
        
        // 180
        
        for(int i=0;i<index;i++)
        {
            x2[i]=n-1-x[i];
            y2[i]=n-1-y[i];
        }
        
        // 270
        
        for(int i=0;i<index;i++)
        {
            x3[i]=n-1-y[i];
            y3[i]=x[i];
        }
        
        
        
        string w="",w1="",w2="",w3="";
        
        
        for(int i=0;i<index;i++)
        {
            hole[x[i]][y[i]]=1;
            hole1[x1[i]][y1[i]]=1;
            hole2[x2[i]][y2[i]]=1;
            hole3[x3[i]][y3[i]]=1;
        }
        
        
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            {
                if(hole[i][j]==1)  w+=p[i][j];
                if(hole1[i][j]==1)  w1+=p[i][j];
                if(hole2[i][j]==1)  w2+=p[i][j];
                if(hole3[i][j]==1)  w3+=p[i][j];
            }
        
         string ans[4];
        
         ans[0]=w+w1+w2+w3+'.';
        
         ans[1]=w1+w2+w3+w+'.';
        
         ans[2]=w2+w3+w+w1+'.';
        
         ans[3]=w3+w+w1+w2+'.';
        
        
        vector<string> words_in_ans[4];     // 保存拆分后的单词
        
        
        int length=ans[0].length();
        
        string cur="";
        
        // 放进相应单词序列中
        for(int k=0;k<4;k++)
          for(int i=0;i<length;i++)
          {
            if(ans[k][i]=='.')
            {
                
                if(cur!="") words_in_ans[k].push_back(cur);
                
                cur="";
            }
                else cur+=ans[k][i];
          }

        bool valid[4];
        
        for(int i=0;i<4;i++)
            valid[i]=1;
        
        for(int k=0;k<4;k++)
            for(int i=0;i<words_in_ans[k].size();i++)
            {
                if(vocabulary.count(words_in_ans[k][i])==0)  {
                    valid[k]=0;
                    break;
                }
            }
        
        vector<string>   final_ans;
        vector<string>   sort_assist;   // 用于辅助排序
        vector<int>   id;        // 因为要用words_in_ans[k] 进行输出,所以比出来以后还要 找出0-3中是哪个id
        for(int k=0;k<4;k++)
        {
            if(valid[k])
            {
               final_ans.push_back(ans[k]);
                string  s="";
                
                for(int i=0;i<words_in_ans[k].size();i++)
                    s+=words_in_ans[k][i];
                
                sort_assist.push_back(s);
                id.push_back(k);
                
              
            }
        }
        
        int ans_size=final_ans.size();
        
        if(ans_size==0)
            cout<<"Case #"<<l+1<<": "<<"FAIL TO DECRYPT"<<endl;
        else if(ans_size==0)
        {
            cout<<"Case #"<<l+1<<":";
            
            for(int i=0;i<words_in_ans[0].size();i++)
            {
                cout<<" "<<words_in_ans[0][i];
            }
            
            cout<<endl;
            
            
        }
        
      
        else
        {
            int min_index=0;
            string min_ans=sort_assist[0];
            
            for(int i=0;i<ans_size;i++)
            {
                if(sort_assist[i]<min_ans)
                {
                    min_index=i;
                    min_ans=sort_assist[i];
                    
                }
            }
            
            int ans_index=id[min_index];
            
            cout<<"Case #"<<l+1<<":";
            
            for(int i=0;i<words_in_ans[ans_index].size();i++)
            {
                cout<<" "<<words_in_ans[ans_index][i];
            }
            
            cout<<endl;
              
        }
        
    }
    
    
}


转载于:https://www.cnblogs.com/jingqi814/p/3644380.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值