日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hihocoder 1632 : Secret Poems 思维|技巧

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hihocoder 1632 : Secret Poems 思维|技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

定義一個矩陣 他有n*n大小 然后給出他的真實信息的走法 讓我們變換走法 再次把真實信息填入矩陣中
n<=100

分析

可以發現原文的讀取方式無非就是如此
(0,1)向左
(1,-1)左下
(1,0)向下
(-1,1)右上
1邊界檢查
(1,0)向下
(1,-1)左下
(0,1)向左
(-1,1)右上
2退出檢查
觀察發現其中下和左移動都是1步 走斜線都是走到頭
所以可以用邊界檢查控制移動方向從而按照對應的移動方式還原真實信息
當經過1后 發現剩下的方向就是1處之前的順序 倒著來
那么我們就可以用一個方向向量表示方向
然后到1處就 逆序遍歷方向向量
注意n的奇偶情況下 路徑不同 但都是在右上或左下 走逆序方向
發現n為奇數時 在右上逆向 n為偶數在左下逆向 然而分別都是走斜邊到的這一點
那么我們就可以在走斜邊的時候判斷如果到了這兩點 就把他們方向逆序化0
得到了密文信息 螺旋矩陣輸入就可以了
就是邊界檢查什么的 還有控制移動的時候不好寫 還原信息的過程易出錯

#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){//方向變化 為了防止倒方向出現問題 還是再+4if(x==n&&y==n)break; //這句話比較奇怪 加在這里AC 下面的if-else 后面就RE 哪位細心地網友看出來為何了 可以留言一下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; }

總結

以上是生活随笔為你收集整理的Hihocoder 1632 : Secret Poems 思维|技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。