http://noi.openjudge.cn/ch0108/20/
Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There’s no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x
注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵,当然他使用任何字母都是可以的。
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。
你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
第一行包含一个整数(范围2到20),表示使用的列数。
第二行是一个长度不超过200的字符串。
一行,即原始信息。
5
toioynnkpheleaigshareconhtomesnlewx
theresnoplacelikehomeonasnowynightx
这道题可分为两步
首先是蛇形将字符串放入数组
然后是按列将字符数组输出
这道题比较大的一个问题就是:
关于怎么把string放入char二维数组还不乱码?
以下给出三种方法
1、array
2、定义为int二维数组,输出char强制转换
3、char二维数组定义在main函数外
char数组定义为array
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
int row = s.length();
row = ceil(row / n);
array<array<char, 22>, 22>charmat;
for (int i = 0; i < row; i++) {
for (int j = 0; j < n; j++) {
charmat[i][j]=s[i*n+j];
}
if (i % 2) {
reverse(charmat[i].begin(), charmat[i].begin() + n);
}
}
for (int j = 0; j < n; j++) {
for (int i = 0; i < row; i++) {
cout << charmat[i][j];
}
}
//for (int i = 0; i < row; i++) {
// for (int j = 0; j < n; j++) {
// cout << charmat[i][j] << " ";
// }
// cout << endl;
//}
return 0;
}
将char定义为int数组,最后强制输出
#include
#include
using namespace std;
int n;char s[250];
int l,s1[250][250],ans=0;
int main()
{
cin>>n>>s;
l=strlen(s);
int k=0;
for(int i=0;i<l/n;i++)
for(int j=0;j<n;j++){
if(!(i%2))s1[i][j]=s[k++];
else s1[i][n-1-j]=s[k++];
}
while(ans<n){
for(int i=0;i<l/n;i++)
cout<<char(s1[i][ans]);
ans++;
}
return 0;
}
#include
#include
#include
using namespace std;
char s1[250];
char c1[300][300];
int main()
{
int n;
//string s1;
//char s1[250];
//char c1[300][300];
cin >> n;
cin >> s1;
int i = 0, j = 0, k = 0;
//int l = s1.length();
int l = strlen(s1);
int m = l / n;
for (i = 0; i < m; i++)
{
if (i % 2 == 0)
{
for (j = 0; j < n; j++)
{
c1[i][j] = s1[k];
k++;
}
}
else
{
for (j = n - 1; j >= 0; j--)
{
c1[i][j] = s1[k];
k++;
}
}
/*另一种写法
for (j = 0; j < n; j++)
{
c1[i][j] = s1[k];
k++;
}
if (i < m)
{
i++;
for (j = n - 1; j >= 0; j--)
{
c1[i][j] = s1[k];
k++;
}
}
*/
}
for (j = 0; j < n; j++)
{
for (i = 0; i < m; i++)
{
cout<<c1[i][j];
}
}
return 0;
}
如果9分错误,可能是因为数组开的不够大
另外char二维数组定义在main函数外面调试就是正常的,而定义在main函数里面就会一直“烫烫烫烫……”,调试时也会显示,无法显示数组。我觉得可能和没有‘\0’有关,但为什么定义在main函数外就正常呢?
但定义在内外都可以通过