Isabella Message SPOJ - ISAB模拟矩阵的旋转
Posted keepz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Isabella Message SPOJ - ISAB模拟矩阵的旋转相关的知识,希望对你有一定的参考价值。
思路
题目链接
题意:题目中先给了一个N阶矩阵样子的字符,后给了一个mask,然后又给出你应该认识的一些单词,最后是让你输出最终字典序最小的一句话。
思路:根据题目要求模拟即可。这里会用到stringstream,学习一下。不过个人觉得比较重要的是矩阵旋转部分,下面附这一块的代码。
void zhuan()
char temp[maxn][maxn];
memset(temp, 0, sizeof(temp)); //临时数组
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
temp[i][j] = mask[N-j-1][i]; //这一块当成结论记住吧
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
mask[i][j] = temp[i][j];
AC代码
#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<sstream>
using namespace std;
int T, N, M;
const int maxn = 50 + 10;
char s[maxn][maxn], mask[maxn][maxn];
string words[maxn*2];
map<string, int> word;
vector<string> standard;
void zhuan()
char temp[maxn][maxn];
memset(temp, 0, sizeof(temp));
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
temp[i][j] = mask[N-j-1][i];
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
mask[i][j] = temp[i][j];
int main()
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
cin >> T;
for(int t = 1; t <= T; t++)
memset(s, 0, sizeof(s));
memset(mask, 0, sizeof(mask));
cin >> N;
for(int i = 0; i < N; i++)
scanf("%s", s[i]);
for(int i = 0; i < N; i++)
scanf("%s", mask[i]);
cin >> M;
word.clear();
for(int i = 0; i < M; i++)
cin >> words[i];
word[words[i]] = 1;
standard.clear();
string tmmp[4];
for(int ans = 0; ans < 4; ans++)
tmmp[ans] = "";
for(int i = 0; i < N; i++)
for(int j = 0; j < N; j++)
if(mask[i][j] == '*')
if(s[i][j] != '.')
tmmp[ans] += s[i][j];
else
tmmp[ans] += " ";
zhuan();
string tmp[4];
tmp[0] = tmmp[0] + tmmp[1] + tmmp[2] + tmmp[3];
tmp[1] = tmmp[1] + tmmp[2] + tmmp[3] + tmmp[0];
tmp[2] = tmmp[2] + tmmp[3] + tmmp[0] + tmmp[1];
tmp[3] = tmmp[3] + tmmp[0] + tmmp[1] + tmmp[2];
for(int ans = 0; ans < 4; ans++)
int _front = 0, _back = tmp[ans].size();
for(int i = 0; i < tmp[ans].size(); i++)
if(tmp[ans][i] == ' ')
_front++;
else
break;
for(int j = tmp[ans].size() - 1; j >= 0; j--)
if(tmp[ans][j] == ' ')
--_back;
else
break;
string temp = "";
for(int i = _front; i < _back; i++)
temp += tmp[ans][i];
//cout << "temp =" << temp << "\\" << endl;
string table[maxn*2];
stringstream ss(temp);
int cnt = 0;
while(ss >> table[cnt])
cnt++;
int flag = 0;
for(int i = 0; i < cnt; i++)
if(word[table[i]])
continue;
else
flag = 1;
break;
if(!flag)
standard.push_back(temp);
if(!standard.empty())
sort(standard.begin(), standard.end());
cout << "Case #" << t << ": " << standard[0] << endl;
else
cout << "Case #" << t << ": " << "FAIL TO DECRYPT" << endl;
以上是关于Isabella Message SPOJ - ISAB模拟矩阵的旋转的主要内容,如果未能解决你的问题,请参考以下文章