TIOJ-1458

蜜蜂跟學妹很喜歡寫情書,在這資訊發達的時代,他們的情書當然不是傳統的輸信,而是用E-Mail傳送的。但蜜蜂很害羞,他不希望他的情書被駭客攔截,因此他決定把內容加密。他跟學妹發明了一種加密方法,他們要加密的文字只有大寫英文字母以及空白字元,首先將每個字元編號,空白編成0,A編成1,B編成2,…,Z編成26。再將編號轉為二進位後,以下圖的方式填入一個RxC的矩陣中:

1
2
3
4
5
6
7
0 → 0 → 0 → 1
       ↓
0 → 1 → 0  0
↑    ↓ ↓
0   0 ← 1  0
↑      ↓
1 ← 0 ← 1 ← 0

B = 00010, E = 00101, E = 00101

結尾不夠的部分就直接補0,範例中R=4且C=4,要編碼的字串為“BEE”,產生矩陣後,再一列一列的將數字接起來得到最後的編碼結果,因此“BEE”最後會得到的編碼字串是0001010000101010
$R, C\le 20, 5\times \sum |S|\le R\times C$


首先是輸入,使用getline前要先cin.ignore(),我不太清楚哪裡爛掉,反正遇到輸入卡bug就先ignore(?
然後用一個字串把每個字元的二進位給接起來,並且補0,這樣就能直接用那個字串來填格子。
至於填格子的順序,我還沒想到一個好的迴圈可以處理他。
所以我是觀察到他會是先走右邊,不能的話就往下,不能的話就往左,再來往上…
所以就紀錄目前的方向,當不能走時(超出邊界or走過了)就順時針換個方向試試看。
然後把每行分別輸出就是答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
-------------- | /
| | /
| | /
| * |/ | | ------ *
| | | | / \
| | |\ | | | |\ |
\ | | | \ | | | | \ |
\ | | | \ | | \ / \ |
V | | \ \__/| ----- \ |
*/
#include <bits/stdc++.h>
using namespace std;

#define EmiliaMyWife ios::sync_with_stdio(0); cin.tie(NULL);
/*--------------------------------------------------------------------------------------*/

int d[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //Right, Down, Left, Up

signed main() { EmiliaMyWife
int t;
cin >> t;
auto proc = [&] (int x) {
string s(5, '0');
for(int i = 4; ~i; i--)
if(x >> i & 1)
s[4 - i] = '1';
return s;
};

for(int tc = 1; tc <= t; tc++) {
cout << tc << ' ';

int r, c;
auto check = [&] (int x, int y) { return x>=0&&x<r&&y>=0&&y<c; };
string s;
cin >> r >> c;

cin.ignore();
getline(cin, s);

string owo;
for(char c : s) {
if(c == ' ')
owo += proc(0);
else
owo += proc(c - 'a' + 1);
}
while(owo.size() < r * c)
owo.push_back('0');

vector<string> arr(r, string(c, '0'));
vector<vector<bool>> vis(r, vector<bool>(c));
int x = 0, y = -1, it = 0;
for(char c : owo) {
while(!check(x + d[it][0], y + d[it][1]) || vis[x + d[it][0]][y + d[it][1]])
it = (it + 1) % 4;
x += d[it][0];
y += d[it][1];
arr[x][y] = c;
vis[x][y] = 1;
}

for(const auto &w : arr)
cout << w;
cout << '\n';
}
}