先写一个常规的解法
#include <bits/stdc++.h>
using namespace std;
int main()
{
string x,s;
getline(cin,x);
for(int i=0;i<x.length();i++)
{
int j=(i+1)%x.length();
cout<<char(x[i]+x[j]);
}
cout<<s;
return 0;
}
当然,对于这个题,使用常规方法是比较简单的。
其实我们可以换一个角度去看一下
对于题目中所说的由字符串s1变换到s2,我们不难能联想到非齐次线性方程组,即Ax=b
同样,我们可以将这种转化变成以下方程:
x1+x2+ =y1
x2+x3 =y2
x3+x4 =y3
……
x1+ +xn=yn
进而变成
显然,对于矩阵A本身是满秩的,并且其增广矩阵的秩等于原矩阵的秩,因此矩阵有唯一解
因此我们可以写出以下代码
#include <bits/stdc++.h>
using namespace std;
class matrix
{
public:
int **p;
int m;
int n;
void setmatrix(int x,int y)
{
m=x;
n=y;
p=new int *[x];
for(int i=0;i<x;i++)
{
p[i]=new int [y];
}
}
void show()//矩阵的展示,当然,这个地方好像并没有什么用
{
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<" ";
}
cout<<endl;
}
}
matrix operator*(matrix &x)
{
matrix temp;
temp.setmatrix(m,x.n);//创建矩阵
for(int i=0;i<m;i++)
{
for(int j=0;j<x.n;j++)
{
int sum=0;
for(int k=0;k<n;k++)
{
sum+=p[i][k]*x.p[k][j];
}
temp.p[i][j]=sum;//传入相乘的数值
}
}
return temp;
}
~matrix()
{
//记得在析构里释放内存
for(int i=0;i<n;i++)
{
delete []p[i];
}
delete []p;
}
};
int main()
{
string s;
getline(cin,s);
int n=s.length();//获取字符串长度->向量的维数
matrix A;
A.setmatrix(n,n);//根据字符串长度开辟对应方阵
//描绘方阵A
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
A.p[i][j]=0;
if(i!=n-1)
{
if(i==j||i==j-1) A.p[i][j]=1;
}
else
{
if(j==0||j==n-1) A.p[i][j]=1;
}
}
}
//创建向量(列矩阵)X
matrix x;
x.setmatrix(n,1);
for(int i=0;i<n;i++)
{
x.p[i][0]=int(s[i]);
}
matrix y=A*x;
for(int i=0;i<n;i++)
{
cout<<char(y.p[i][0]);
}
return 0;
}
当然,这样的代码相对于常规解法,肯定是繁琐得多的,这个地方仅仅是提供一个思路