可变长度多维数组
函数可变参数练习
#include<iostream>
#include<stdarg.h>//=#include<cstdarg>
using namespace std;
int sum(int cnt,...){
va_list ap;
va_start(ap,cnt);
int res=0;
for(int i=0;i<cnt;i++){
int arg=va_arg(ap,int);
res+=arg;
}
va_end(ap);
return res;
}
int main(){
int res=sum(4,1,2,3,4);
printf("%d",res);
return 0;
}
多维数组输入与输出
#include<iostream>
#include<cstdarg>
using namespace std;
struct Array
{
int *buffer; // 数据区
int *dimlength; // 各维长度
int *partlength; // 换算辅助
int dims; // 维数
};
int InitArray(Array &A, int dims, ...)
{
A.dims = dims;
A.dimlength = new int[dims];
A.partlength = new int[dims];
va_list arg_ptr;
va_start(arg_ptr, dims);
int length = 1; // 统计数据总数
for (int i = 0; i < dims; i++)
{
int k = va_arg(arg_ptr, int);
A.dimlength[i] = k;
length *= k;
}
// 计算partlength
A.partlength[dims - 1] = 1;
for (int i = dims - 2; i >= 0; i--)
A.partlength[i] = A.partlength[i + 1] * A.dimlength[i + 1];
A.buffer = new int[length];
va_end(arg_ptr);
return 0;
}
int Get(Array &A, int i0, ...)
{
va_list arg_ptr;
va_start(arg_ptr, i0);
int aIndex = i0*A.partlength[0];
for (int i = 1; i < A.dims; i++)
aIndex += va_arg(arg_ptr, int)*A.partlength[i];
va_end(arg_ptr);
return A.buffer[aIndex];
}
void Set(Array &A, int value, ...)
{
va_list arg_ptr;
va_start(arg_ptr, value);
int aIndex = 0;
for (int i = 0; i < A.dims; i++)
aIndex += va_arg(arg_ptr, int)*A.partlength[i];
va_end(arg_ptr);
A.buffer[aIndex] = value;
}
int main(){
Array A;
InitArray(A, 3, 4, 5, 6);
Set(A, 11, 1, 2, 2);
cout << Get(A, 1, 2, 2) << endl;
return 0;
}
稀疏矩阵
稀疏矩阵的乘法
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdarg>
#include<vector>
using namespace std;
#define ll long long
#define mem(x,v) memset(x,v,sizeof(x))
struct TriNode{ //三元组结点
int r,c,v;
};
void PrintTriNode(const TriNode &T){ //输出三元组结点
cout<<T.r<<" "<<T.c<<" "<<T.v<<endl;
}
struct TriMatrix{ //三元组
int mu,nu,tu;
vector<TriNode> data; // 三元组法表示的非零元
//TriNode *data;
vector<int> rsum; // 每行非零元个数
vector<int> rpos; // 行向量
};
void InputMatrix(TriMatrix &M){ //输入三元组
cin>>M.mu>>M.nu;
M.tu=0;
for(int i=0;i<M.mu;i++){
for(int j=0;j<M.nu;j++){
int t;
cin>>t;
if(t!=0){
M.data.push_back({i,j,t});
M.tu++;
}
}
}
}
void CalcRPosMatrix(TriMatrix &M){
for(int i=0;i<M.mu;i++){
M.rsum.push_back(0);
}
for(int i=0;i<M.tu;i++){
M.rsum[M.data[i].r]++;
}
M.rpos.push_back(0);
for(int i=1;i<M.tu;i++){
M.rpos.push_back(M.rpos[i-1]+M.rsum[i-1]);
}
}
void PrintMatrix(const TriMatrix &M){//输出三元组
cout<<"============================"<<endl;
cout<<"mu="<<M.mu<<" nu="<<M.nu<<" tu="<<M.tu<<endl;
for(int i=0;i<M.tu;i++){
PrintTriNode(M.data[i]);
}
cout<<endl;
cout<<"rsum:";
for(int i=0;i<M.mu;i++)cout<<M.rsum[i]<<" ";
cout<<endl;
cout<<"rpos:";
for(int i=0;i<M.mu;i++)cout<<M.rpos[i]<<" ";
cout<<endl;
cout<<"============================"<<endl;
}
void PrintMatrixArray(const TriMatrix &M){//输出矩阵
int array[M.mu][M.nu]={0};
for(int i=0;i<M.mu;i++){
for(int j=0;j<M.nu;j++)array[i][j]=0;
}
for(int i=0;i<M.tu;i++){
array[M.data[i].r][M.data[i].c]=M.data[i].v;
}
for(int i=0;i<M.mu;i++){
for(int j=0;j<M.nu;j++)cout<<array[i][j]<<" ";
cout<<endl;
}
}
void AddNode(TriMatrix &M,int r,int c,int v){
if(M.tu!=0){
vector<TriNode>::iterator it=M.data.begin();
int presence=0;
while(it!=M.data.end()){
if(r==it->r&&c==it->c){
it->v+=v;
presence=1;
break;
}
it++;
}
if(presence==0){
M.data.push_back({r,c,v});
M.tu++;
}
}else{
M.data.push_back({r,c,v});
M.tu++;
}
// if(M.tu==0)M.data.push_back({r,c,v});
// else{
// vector<TriNode>::iterator it=M.data.begin();
// for(int i=0;i<M.tu;i++)++it;
// M.data.insert(it,{r,c,v});
// }
// M.tu++;
}
TriMatrix Mul(const TriMatrix &M1,const TriMatrix &M2){
TriMatrix M;
M.mu=M1.mu;M.nu=M2.nu;M.tu=0;
for(int i=0;i<M1.tu;i++){
int c=M1.data[i].c;
for(int j=M2.rpos[c];j<M2.rpos[c]+M2.rsum[c];j++){
AddNode(M, M1.data[i].r , M2.data[j].c , M1.data[i].v*M2.data[j].v);
}
}
return M;
}
int main(){
TriMatrix M1,M2;
InputMatrix(M1);
InputMatrix(M2);
CalcRPosMatrix(M1);
CalcRPosMatrix(M2);
//PrintMatrix(M1);
//PrintMatrix(M2);
TriMatrix M=Mul(M1,M2);
CalcRPosMatrix(M);
//PrintMatrix(M);
PrintMatrixArray(M);
return 0;
}