J - Encoding(字符串&暴力)

J - Encoding(字符串&暴力)

思路:由于只有 26 26 个字母,所以预处理一下 26 26 个字母的编码方式,然后对字符串进行操作转换,最后再蛇形填数即可,具体看代码。

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;
}
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/105965976
今日推荐