生活随笔
收集整理的這篇文章主要介紹了
Hihocoder 1632 : Secret Poems 思维|技巧
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意
定義一個(gè)矩陣 他有n*n大小 然后給出他的真實(shí)信息的走法 讓我們變換走法 再次把真實(shí)信息填入矩陣中
n<=100
分析
可以發(fā)現(xiàn)原文的讀取方式無非就是如此
(0,1)向左
(1,-1)左下
(1,0)向下
(-1,1)右上
1邊界檢查
(1,0)向下
(1,-1)左下
(0,1)向左
(-1,1)右上
2退出檢查
觀察發(fā)現(xiàn)其中下和左移動(dòng)都是1步 走斜線都是走到頭
所以可以用邊界檢查控制移動(dòng)方向從而按照對(duì)應(yīng)的移動(dòng)方式還原真實(shí)信息
當(dāng)經(jīng)過1后 發(fā)現(xiàn)剩下的方向就是1處之前的順序 倒著來
那么我們就可以用一個(gè)方向向量表示方向
然后到1處就 逆序遍歷方向向量
注意n的奇偶情況下 路徑不同 但都是在右上或左下 走逆序方向
發(fā)現(xiàn)n為奇數(shù)時(shí) 在右上逆向 n為偶數(shù)在左下逆向 然而分別都是走斜邊到的這一點(diǎn)
那么我們就可以在走斜邊的時(shí)候判斷如果到了這兩點(diǎn) 就把他們方向逆序化0
得到了密文信息 螺旋矩陣輸入就可以了
就是邊界檢查什么的 還有控制移動(dòng)的時(shí)候不好寫 還原信息的過程易出錯(cuò)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char a[
105][
105],ans[
105][
105];
int dir[][
2] = {{
0,
1},{
1,-
1},{
1,
0},{-
1,
1}},dir2[][
2] = {{
0,
1},{
1,
0},{
0,-
1},{-
1,
0}};
int main()
{
int n;
while(~
scanf(
"%d",&n)){
for(
int i=
1;i<=n;i++)
scanf(
"%s",a[i]+
1);
string l;
int x=
1,y=
1,tmp=
1;l = a[x][y];
for(
int i=
0;;i=(i+tmp+
4)%
4){
if(x==n&&y==n)
break;
if(i%
2==
0){x+=dir[i][
0];y+=dir[i][
1];l.append(
1,a[x][y]);}
else{
while(x+dir[i][
0]!=
0&&x+dir[i][
0]<=n&&y+dir[i][
1]!=
0&&y+dir[i][
1]<=n){x+=dir[i][
0];y+=dir[i][
1]; l.append(
1,a[x][y]);}
if((x==
1&&y==n)||(x==n&&y==
1))tmp=-tmp;}}
int t=
0;x=
1,y=
1;ans[x][y]=l[t++];
for(
int i=
0;t<=n*n-
1;i=(i+
1)%
4){
while(t<n*n&&x+dir2[i][
0]>
0&&y+dir2[i][
1]>
0&&x+dir2[i][
0]<=n&&y+dir2[i][
1]<=n&&ans[x+dir2[i][
0]][y+dir2[i][
1]]==
0)ans[x+=dir2[i][
0]][y+=dir2[i][
1]]=l[t++];}
for(
int i=
1;i<=n;i++)
printf(
"%s\n",ans[i]+
1);
memset(ans,
0,
sizeof(ans));
memset(a,
0,
sizeof(a));}
return 0;
}
總結(jié)
以上是生活随笔為你收集整理的Hihocoder 1632 : Secret Poems 思维|技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。