NC219027. 螺旋矩阵
描述
输入描述
第一行一个正整数 ,表示测试数据的组数。
每组测试数据在一行中给出一个长度不超过的字符串字符串只包含可见字符
输出描述
按格式输出字符矩阵,然后输出一个空行字符串行末不要有额外空格,行首空格
示例1
输入:
4 TellMeHowEarnMoney QWERTYUIOP poiuytrewqasdfg WhatsYou
输出:
enoMn yMllr eTea HowE TRE YQW UIOP gfd yuis tpoa rewq sta YWh ou
C 解法, 执行用时: 7ms, 内存消耗: 1060K, 提交时间: 2021-05-19 14:33:59
#include<stdio.h> char a[100][100]={0}; char s[10000]; int dx[5]={1,0,-1,0}; int dy[5]={0,-1,0,1}; int main() { int i,j,k,l,n,m,p,q,t,shang,xia,zuo,you; scanf("%d",&t); while(t--){ shang=50;xia=50;zuo=50;you=50; for(i=0;i<100;i++) for(j=0;j<100;j++)a[i][j]=0; scanf("%s",s); p=0;i=1;n=50;m=50;a[50][50]=s[0]; while(s[i]!='\0'){ for(j=0;j<(p+2)/2&&s[i]!='\0';j++){ n+=dy[p%4];m+=dx[p%4]; a[n][m]=s[i++]; if(n>xia)xia=n;if(n<shang)shang=n;if(m>you)you=m;if(m<zuo)zuo=m;//确定边界 } p++; } if(a[shang][zuo]==0) for(i=zuo;a[shang][i]==0;i++)a[shang][i]=' '; if(a[xia][you]==0) for(i=you;a[xia][i]==0;i--)a[xia][i]=' '; for(i=shang;i<=xia;i++){ if(a[i][zuo]==0)a[i][zuo]=' '; if(a[i][you]==0)a[i][you]=' ';} for(i=shang;i<=xia;i++){ for(j=zuo;j<=you;j++)printf("%c",a[i][j]);printf("\n");} printf("\n"); } }
C++(clang++11) 解法, 执行用时: 8ms, 内存消耗: 1172K, 提交时间: 2021-03-31 13:37:20
#include<bits/stdc++.h> using namespace std; const int N=1e6+10; char a[N]; int n; int dx[4]={0,-1,0,1}; int dy[4]={-1,0,1,0}; char ans[200][200]; void solve(){ scanf("%s",a+1); int len=strlen(a+1); n=sqrt(len); while(n*n<len)n++; for(int i=len+1;i<=n*n;i++)a[i]=' '; //reverse(a+1,a+1+n*n); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ ans[i][j]='$'; } } int to=0; int x=n,y=n; if(n%2==0){ x=1,y=1,to=2; } int cnt=n*n; while(cnt--){ ans[x][y]=a[cnt+1]; if(ans[x+dx[to]][y+dy[to]]!='$'){ to=(to+1)%4; } x+=dx[to],y+=dy[to]; } for(int i=1;i<=n;i++){ int k=n;while(ans[i][k]==' ')k--; if(k==0)continue; for(int j=1;j<=k;j++){ printf("%c",ans[i][j]); } printf("\n"); } printf("\n"); } int main(){ int t; cin>>t; while(t--){ solve(); } }