⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 runlength.cpp

📁 费诺码编码...很好
💻 CPP
字号:
#include"iostream.h"
#include<iomanip.h>
#include"vector"
using namespace std;
struct data
{
	int mz;
	vector <char> code;
};
struct rle
{
	int length;
	int mz;
};
int get_gd(int n)
{
	int i=0;
	int j=n-1;
	while(j>0)
	{
		j=(j-j%2)/2;
		i++;
	}
	return i;
}
void Creadmz(int hd,vector<data>& vd,int hs)
{
	int w=0;
	int ws=get_gd(hd);
	for(int i=0;i<hd;i++)
	{
		data d;
		d.mz=i+hs;
		w=i;
		while(w>0)
		{
			if(w % 2  == 1)
				d.code.push_back('1');
			else d.code.push_back('0');
			w=(w-w%2)/2.0;
		}
		for(int m = d.code.size();m <ws;m++)
			d.code.push_back('0');
		vd.push_back(d);
	}
}
void print( vector<data>vd)
{
	for(int i=0;i<vd.size();i++)
	{
		cout<<vd[i].mz<<" ";
		for(int j=vd[i].code.size()-1;j>=0;j--)
			cout<<vd[i].code[j];
		cout<<endl;
	}
}
void print1( vector <rle> re)
{
	for(int i=0;i<re.size();i++)
	{
		cout<<"<"<<re[i].mz<<","<<re[i].length<<">"<<" ";
	}
}
template <typename elem> 
void print2(vector <elem> cd)
{
	for(int i=0;i<cd.size();i++)
	{
		cout<<cd[i];
	}
	cout<<endl;
}
void read(vector<rle> &vr,int hd,int & cor)
{
	int row,acr;
	rle re;
	cout<<"请输入矩阵的行列数:"<<endl;
	cin>>row;
	cin>>acr;
	cor=acr;
	cout<<"请输入灰度值矩阵:"<<endl;
	for(int i=0;i<row;i++)
	{
		int n;
		n=re.mz=0;
		if(n==re.mz)
		{	
			cin>>n;
		}
		for(int j=1;j<acr;)
		{
			re.mz=n;
			re.length=0;
			while(n==re.mz&&j<acr)
			{
				re.length++;
				j++;
				cin>>n;
			}
			if(n!=re.mz)
			{
				vr.push_back(re);
				if(j==acr)
				{
					re.mz=n;
					re.length=1;
					vr.push_back(re);
				}
			}
			else if(j==acr)
			{
				if(n==re.mz)
				{
					re.length++;
					vr.push_back(re);
				}
				else {
					re.mz=n;
					re.length=1;
					vr.push_back(re);
				}
			}
			else vr.push_back(re);
		}
	}
}
bool read1(vector <char>& vc,int num)
{
	cout<<"请输入你要解码的序列(以'#'号结束):"<<endl;
	char ch;
	cin>>ch;
	while(ch!='#')
	{
		vc.push_back(ch);
		cin>>ch;
	}
	if(vc.size()%num!=0)
	{
		cout<<"你输入的码序列不正确请较正后再输入。";
		return false;
	}
	return true;

}
int find(vector <data> vd,int x)
{
	int low=0;
	int high=vd.size()-1;
	int mid=0;
	while(low<=high)
	{
		mid = (low + high)/2;
		if(vd[mid].mz==x) return mid;
		else if(x<vd[mid].mz) high = mid-1;
		else low = mid +1;
	}
	cout<<"the element '"<<x<<"'not find."<<endl;
	return -1;
}
void Encode(vector <rle> vr,vector <data> vd,vector<data> vh,vector<char> &cd)
{
	int mc=0;
	int len=0;
	for(int i=0;i<vr.size();i++)
	{
		mc=find(vd,vr[i].mz);
		for(int j=vd[mc].code.size()-1;j>=0;j--)
			cd.push_back(vd[mc].code[j]);
		len=find(vh,vr[i].length);
		for(int k=vh[len].code.size()-1;k>=0;k--)
			cd.push_back(vh[len].code[k]);
	}
}
void coding(vector<char> vc,vector<int> &vi,int gd,int gds)
{
	for(int i = 0;i<vc.size();)
	{
		int sum=0, sub=1;
		for(int j=0;j<gd;j++)
		{
			switch(vc[i])
			{
				case '1': sum +=pow(2,gd-j-1); i++;break;
				case '0': i++; break;
			}
		}
		for(int k=0;k<gds;k++)
		{
			switch(vc[i])
			{
				case '1': {sub +=pow(2,gds-k-1); i++;}break;
				case '0': i++; break;
			}
		}
		for(int s= 0;s<sub;s++)
			vi.push_back(sum);
	}
}
int main()
{
	int n=0;
	cout<<"请输入灰度值:";
	cin>>n;
	int cor;
	int j,k;
	vector<data>vd;
	vector<data>vh;
	vector<char>cd;
	vector<rle>re;
	vector<char> vc;
	vector<int> vi;
	Creadmz(n,vd,0);
	print(vd);
	read(re,n,cor);
	j=get_gd(cor);
	k=get_gd(n);
	Creadmz(cor,vh,1);
	print(vh);
	print1(re);
	Encode(re,vd,vh,cd);
	cout<<endl;
	cout<<"编码结果:"<<endl;
	print2(cd);
	if(read1(vc,j+k))
		coding(vc,vi,k,j);
	print2(vi);
	return 0;
}
/*
1 1 1 1 1 1 1
2 1 3 7 7 7 7
6 5 4 3 6 4 4
1 2 3 7 7 5 6
3 3 3 3 4 4 4
6 5 4 1 2 5 3
6 5 7 4 1 2 3
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -