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

📄 计算卡洛图.cpp

📁 一些c++小程序
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
const int maxsize=16;
const int size=4;
struct   spoint{
	int  result;
	int  arr[size];//arr[0]为最低位!
};
class  graph{
private:
	spoint point[maxsize];
	int  flag[maxsize],endge[maxsize][maxsize],flagsum[maxsize];
	char  result[maxsize*maxsize];
	int numofvaluepoint,array[maxsize][size/2][size/2][size/2][size/2][maxsize*maxsize],path[maxsize];
public:
	graph(){
		char str[maxsize*size];
		int flagtemp=0,sum=0,temp[size],error=0;
		int i,j,k,s,t,u;
		numofvaluepoint=0;
         for(i=0;i<maxsize;i++)
			 for(j=0;j<size/2;j++)
				 for(k=0;k<size/2;k++)
					 for(s=0;s<size/2;s++)
						 for(t=0;t<size/2;t++)
							 for(u=0;u<maxsize*maxsize;u++)
								 array[i][j][k][s][t][u]=0;
		 for( i=0;i<maxsize;i++)
		 {
		    for(j=0;j<size;j++)
			{
				point[i].arr[j]=-1;
				point[i].result=0;
				temp[j]=-1;
				flag[i]=0;
				flagsum[i]=0;
			}
			for(s=0;s<maxsize;s++)
				endge[i][s]=0;
			path[i]=-1;
		 }
		 cout<<"请输入一个函数变量表达式!正变量用大写表示,反变量用小写!(如有AB的反变量请化成A的反变量乘B的)"<<endl;
		 cin>>str;
		 str[int(strlen(str))+1]=str[int(strlen(str))];
		 str[int(strlen(str))]='+';
		 for(i=0;i<int(strlen(str));i++)
		 {
			 switch(str[i])
			 {
			 case '+':
				 for(j=0;j<size/2;j++)
                    for(k=0;k<size/2;k++)
						for(s=0;s<size/2;s++)
							for(t=0;t<size/2;t++)
							{
								bool te=temp[3]==-1&&temp[2]==-1&&temp[2]==-1&&temp[0]==-1;
								if((j==temp[3]||temp[3]==-1)&&(k==temp[2]||temp[2]==-1)&&(s==temp[1]||temp[1]==-1)&&(t==temp[0]||temp[0]==-1)&&!te)
								{
									int tem=j*8+k*4+s*2+t;
									point[tem].result=1;
									numofvaluepoint++;
									point[tem].arr[3]=j;
									point[tem].arr[2]=k;
									point[tem].arr[1]=s;
									point[tem].arr[0]=t;
								}
							}
							for(j=0;j<size;j++)
								temp[j]=-1;
				 break;
			 case 'A':
				 temp[int('D'-str[i])]=1;
				 break;
			 case 'B':
				 temp[int('D'-str[i])]=1;
				 break;
			 case 'C':
				 temp[int('D'-str[i])]=1;
				 break;
			 case 'D':
				 temp[int('D'-str[i])]=1;
				 break;
             case 'a':
				 temp[int('d'-str[i])]=0;
				 break;
			 case 'b':
				 temp[int('d'-str[i])]=0;
				 break;
			 case 'c':
				 temp[int('d'-str[i])]=0;
				 break;
			 case 'd':
				 temp[int('d'-str[i])]=0;
				 break;
			 default:
				 error++;
				 if(error==1)
				 {
				 cout<<"你的输入有错误!"<<endl;
				 exit(1);
				 }
			 } 
		 }
		 for(i=0;i<maxsize;i++)
			 for(j=0;j<maxsize;j++)
                 if(point[i].result==point[j].result&&point[i].result==1)
				 {
					 if(i!=j)
					 {
					 int t0=!point[i].arr[0]-point[i].arr[0],t1=2*(!point[i].arr[1]-point[i].arr[1]),t2=4*(!point[i].arr[2]-point[i].arr[2]),t3=8*(!point[i].arr[3]-point[i].arr[3]);
					 if(j-i==t0||j-i==t1||j-i==t2||j-i==t3)
					 endge[i][j]=1;
					 }
					 else
						 endge[i][j]=-1;
				 }
				 flag[0]=numofvaluepoint;
				  flag[maxsize-1]=flag[0]/maxsize;
				  int num=0;
				   for(i=0;i<maxsize;i++)
                     if(point[i].result==1)
                        num++;
				   if(num==0)
				   {
					   cout<<'0'<<endl;
					     exit(0);
				   }
				   else
					   if(num==16)
					   {
						   cout<<'1'<<endl;
						   exit(0);
					   }
	}
	void  delonesame(int low,int range )
	{
      int i,j,k,s,t,u,same=0;
	   for(i=low+1;i<maxsize;i++)
		   for(j=0;j<flagsum[i];j++)
		   {
			   same=0;
			   for(k=0;k<size/2;k++)
				   for(s=0;s<size/2;s++)
					   for(t=0;t<size/2;t++)
						   for(u=0;u<size/2;u++)
						   {
                             if(array[low][k][s][t][u][range]==1&&array[i][k][s][t][u][j]==array[low][k][s][t][u][range])
								 same++;
						   }
                      if(same==low+1)
					  {
                           for(int a=0;a<size/2;a++)
							    for(int b=0;b<size/2;b++)
								     for(int c=0;c<size/2;c++)
										 for(int d=0;d<size/2;d++)
											array[low][a][b][c][d][range]=0;
										 break;
										 break;
					  }
		   }

	}
	void  resetflag()
	{
		for(int i=0;i<maxsize;i++)
			flag[i]=0;
	}
	void  search(int des,int src,int k)
	{
		int s;
		if(endge[des][src]==-1)
		{
		int overlap=0;
			for(s=0;s<=k;s++)
				for(int j=s+1;j<=k;j++)
				{
					if(path[s]==path[j]||!(k+1==1||k+1==2||k+1==4||k+1==8||k+1==16))
						overlap=1;
				}
				if(!overlap)
				{
			        for(s=0;s<=k;s++)
						array[k][path[s]/8][(path[s]%8)/4][((path[s]%8)%4)/2][path[s]%2][flagsum[k]]=1;
					         flagsum[k]++;
				}
		}
		else
		{
			s=0;
			while(s<maxsize)
			{
				if(endge[src][s]==1&&flag[s]==0)
				{
					flag[s]=1;
					path[k+1]=s;
					search(des,s,k+1);
					flag[s]=0;
				}
				s++;
			}
		}
	}
	void  depthsearch(int des,int src)
	{
	 path[0]=src;
	 resetflag();
	 search(des,src,0);
	}
	void  ridoverlap()
	{
      int i,j,k,s,t,u,m,arraysum[size];
	  for(i=0;i<maxsize;i++)//去掉重复
		for(u=0;u<flagsum[i];u++)
		  for(j=0;j<size/2;j++)
			for(k=0;k<size/2;k++)
				for(s=0;s<size/2;s++)
					for(t=0;t<size/2;t++)
					{
						for(m=u+1;m<flagsum[i];m++)
						{ 
							int sum=0,a,b,c,d;
							for(a=0;a<size/2;a++)
								for(b=0;b<size/2;b++)
									for(c=0;c<size/2;c++)
										for(d=0;d<size/2;d++)
											if(array[i][a][b][c][d][u]==array[i][a][b][c][d][m])
												sum++;
											if(sum==maxsize)
											{
                                               for(a=0;a<size/2;a++)
							                 	 for(b=0;b<size/2;b++)
								                	for(c=0;c<size/2;c++)
										              for(d=0;d<size/2;d++)
														  array[i][a][b][c][d][m]=0;
											}

						}

					}
            //下面是去掉不合格的
		for(i=0;i<maxsize;i++)
			for(j=0;j<flagsum[i];j++)
			{   
				arraysum[0]=arraysum[1]=arraysum[2]=arraysum[3]=0;
				int tempsum=0;
				for(k=0;k<size/2;k++)
					for(s=0;s<size/2;s++)
						for(t=0;t<size/2;t++)
							for(u=0;u<size/2;u++)
							{
                              if(array[i][k][s][t][u][j]==1)
							  {
								  arraysum[0]+=k;
								  arraysum[1]+=s;
								  arraysum[2]+=t;
								  arraysum[3]+=u;
							  }
							}
							for(int r=0;r<size;r++)
							{
								if(arraysum[r]==0||arraysum[r]==i+1||((arraysum[0]+arraysum[1]+arraysum[2]+arraysum[3]==0)&&i==0))
									tempsum++;
							}
							if(i!=0&&i!=1&&!(i==3&&tempsum==2||i==7&&tempsum==1||i==15&&tempsum==0))
							{
                               for(int a=0;a<size/2;a++)
							      for(int b=0;b<size/2;b++)
								     for(int c=0;c<size/2;c++)
										 for(int d=0;d<size/2;d++)
											array[i][a][b][c][d][j]=0;
							}

			}
			//下面是去掉非必要的最小项
		for(i=0;i<maxsize;i++)
			for(j=0;j<flagsum[i];j++)
			    delonesame(i,j);
			//下面是去掉非质最大蕴涵项
			int  oksum,sums,sumd;
				  for(u=0;u<maxsize;u++)
					  for(m=0;m<flagsum[u];m++)
					  {
						   oksum=0;
					for(i=0;i<size/2;i++)
					   for(j=0;j<size/2;j++)
						   for(k=0;k<size/2;k++)
							   for(s=0;s<size/2;s++)
							   {
								   if(array[u][i][j][k][s][m]==1)
									   array[u][i][j][k][s][m]=2;
							   }
				   for(i=0;i<size/2;i++)
					   for(j=0;j<size/2;j++)
						   for(k=0;k<size/2;k++)
							   for(s=0;s<size/2;s++)
							   { 
                                   sums=0;sumd=0;
                                   if(point[i*8+j*4+k*2+s].result==1)
									   sums=1;
								    else
										sums=0;
                                     for(int p=0;p<maxsize;p++)
										 for(int o=0;o<flagsum[p];o++)
												if(array[p][i][j][k][s][o]==1)
														sumd=1;
															 if(sums==sumd)
																 oksum++;
							   }
							   if(oksum!=maxsize)
							   {
					for(i=0;i<size/2;i++)
					   for(j=0;j<size/2;j++)
						   for(k=0;k<size/2;k++)
							   for(s=0;s<size/2;s++)
							   {
								   if(array[u][i][j][k][s][m]==2)
									   array[u][i][j][k][s][m]=1;
							   }
							   }
					  }
			  
	}
void show()
	{
		int i,j,k,s,t,u,arraysum[size],ge=0;
         for(i=0;i<maxsize;i++)
			for(u=0;u<flagsum[i];u++)
			{
				int tempsum=0;
			 arraysum[0]=arraysum[1]=arraysum[2]=arraysum[3]=0;
				for(k=0;k<size/2;k++)
					for(s=0;s<size/2;s++)
						for(t=0;t<size/2;t++)
							for(j=0;j<size/2;j++)
							{
                              if(array[i][k][s][t][j][u]==1)
							  {  
								  tempsum=1;
								  arraysum[0]+=k;
								  arraysum[1]+=s;
								  arraysum[2]+=t;
								  arraysum[3]+=j;
							  }
							}
							for(int r=0;r<size;r++)
							{
								if(tempsum)
								{
								   if(arraysum[r]==0)
								   {
									result[ge]=char('a'+r);
									ge++;
								   }
								   else
									if(arraysum[r]==i+1)
									{
									result[ge]=char('A'+r);
									ge++;
									}
									if(r==size-1)
									{
										result[ge]='+';
										ge++;
									}
								}
							}
			}
			result[ge-1]='\0';
			for(i=0;i<ge-1;i++)
				if(result[i]!='1')
					cout<<result[i];
				cout<<endl;

	}
};
void main()
{
	graph  king;
	for(int i=0;i<maxsize;i++)
		for(int j=i+1;j<maxsize;j++)
			if(i!=j)
	      king.depthsearch(i,j);
	        king.ridoverlap();
			cout<<"化简后的结果为:"<<endl;
	          king.show();
		        cout<<endl;
				  char t;
				  cin>>t;
}

⌨️ 快捷键说明

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