J - Encoding(字符串&暴力)
思路:由于只有 个字母,所以预处理一下 个字母的编码方式,然后对字符串进行操作转换,最后再蛇形填数即可,具体看代码。
AC代码:
#include<cstdio>
#include<cstring>
#include<cctype>
const int N=30;
const char ch[N][6]={{"00000"},{"00001"},{"00010"},{"00011"},{"00100"},{"00101"},{"00110"},{"00111"},{"01000"},{"01001"},{"01010"},{"01011"},{"01100"},{"01101"},{"01110"},{"01111"},{"10000"},{"10001"},{"10010"},{"10011"},{"10100"},{"10101"},{"10110"},{"10111"},{"11000"},{"11001"},{"11010"}};
char s[N*10];
int num[N*N],r,c,a[N][N];
int main(){
while(~scanf("%d%d",&r,&c)){
memset(a,-1,sizeof a);//未填的数记为-1.
getchar();
gets(s);
int cnt=0;
for(int i=0;s[i]!='\0';i++){
int id=0;
if(isalpha(s[i])) id=s[i]-'A'+1;
for(int j=0;j<5;j++)
num[++cnt]=ch[id][j]-'0';
}
int x=1,y=1,cur=0;a[x][y]=num[++cur];
while(cur<cnt){ //蛇形填数.
while(y+1<=c&&a[x][y+1]==-1)
a[x][++y]=num[++cur];
while(x+1<=r&&a[x+1][y]==-1)
a[++x][y]=num[++cur];
while(y>=2&&a[x][y-1]==-1)
a[x][--y]=num[++cur];
while(x>=2&&a[x-1][y]==-1)
a[--x][y]=num[++cur];
}
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
printf(a[i][j]==-1?"0":"%d",a[i][j]);
puts("");
}
return 0;
}