【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; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyfsf.html