洛谷B2113 输出亲朋字符串的拓展

先写一个常规的解法

#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

进而变成

\begin{bmatrix} 1& 1& & & \\ & 1& 1& & \\ & & 1& 1& \\ & & & & \\ 1& & & & 1 \end{bmatrix} \begin{bmatrix} & x1 & \\ & x2& \\ & x3& \\ & & \\ & xn\ & \end{bmatrix} \mapsto\begin{bmatrix} & y1& \\ & y2& \\ & y3& \\ & & \\ & yn& \end{bmatrix}

显然,对于矩阵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;
}

当然,这样的代码相对于常规解法,肯定是繁琐得多的,这个地方仅仅是提供一个思路

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值