烟台建设联合会网站,奉化建设网站,郑州做网站公司 汉狮网络专业,网站开发哪里有培训题意
定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n100
分析
可以发现原文的读取方式无非就是如此 #xff08;0,1#xff09;向左 (1,-1)左下 (1,0)向下 (-1,1)右上 1边界检查 (1,0)向下 (1,-1)左下 (0,…题意
定义一个矩阵 他有n*n大小 然后给出他的真实信息的走法 让我们变换走法 再次把真实信息填入矩阵中 n100
分析
可以发现原文的读取方式无非就是如此 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 得到了密文信息 螺旋矩阵输入就可以了 就是边界检查什么的 还有控制移动的时候不好写 还原信息的过程易出错
#includebits/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 i1;in;i)scanf(%s,a[i]1);string l;int x1,y1,tmp1;l a[x][y];//第一个字符要先加进去for(int i0;;i(itmp4)%4){//方向变化 为了防止倒方向出现问题 还是再4if(xnyn)break; //这句话比较奇怪 加在这里AC 下面的if-else 后面就RE 哪位细心地网友看出来为何了 可以留言一下if(i%20){xdir[i][0];ydir[i][1];l.append(1,a[x][y]);}else{while(xdir[i][0]!0xdir[i][0]nydir[i][1]!0ydir[i][1]n){//边界判断用试加法 如果可行再加 因为一旦越界没有回来的向量xdir[i][0];ydir[i][1]; l.append(1,a[x][y]);}if((x1yn)||(xny1))tmp-tmp;//当到左上或右下转换方向}}int t0;x1,y1;ans[x][y]l[t];for(int i0;tn*n-1;i(i1)%4){while(tn*nxdir2[i][0]0ydir2[i][1]0xdir2[i][0]nydir2[i][1]nans[xdir2[i][0]][ydir2[i][1]]0)ans[xdir2[i][0]][ydir2[i][1]]l[t];} for(int i1;in;i)printf(%s\n,ans[i]1);memset(ans,0,sizeof(ans));memset(a,0,sizeof(a));}return 0;
}