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

📄 trans_cpp.htm

📁 给定金币阵列的初始状态和目标状态
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0065)http://algorithm.fzu.edu.cn/优秀作业和报告/1/S060321095/trans.cpp -->
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3086" name=GENERATOR></HEAD>
<BODY><PRE>#include &lt;iostream.h&gt;
#include &lt;fstream.h&gt;
bool song(int,int);
int k1,m,n,count,min_count;//k1用来存输入的组数,m,n分别指矩阵的行数和列数,count存变换次数,min_count存最大变换次数。
int **p,**q,**r;
bool  match; 
void main()
{  ifstream fin("input.txt");//读入文件流input.txt
   ofstream fout("output.txt");//输出文件流output.txt
   fin&gt;&gt;k1;//输入第一个整数k1
   int i,j,x,y,a,b;
   int ii,temp,i1,i3,temp1;
   for(i=1;i&lt;=k1;i++)
   { fin&gt;&gt;m&gt;&gt;n;//输入行和列
     min_count=m+n+1;//?//
	 p=new int*[m]; //动态分配数组p为源矩阵,q为目标矩阵,r为临时矩阵
	 q=new int*[m];
	 r=new int*[m];
	 for(j=0;j&lt;m;j++)
	 { p[j]=new int[n];
	   q[j]=new int[n];
	   r[j]=new int[n];
	 }
	 for(x=0;x&lt;m;x++) //从input文件中读数据到源矩阵
	 {
		 for(y=0;y&lt;n;y++)
		 { fin&gt;&gt;p[x][y];
		 }
	 }
	 for(x=0;x&lt;m;x++) //从input文件中读数据到目标矩阵
	 {
		 for(y=0;y&lt;n;y++)
		 {
			 fin&gt;&gt;q[x][y];
			 r[x][y]=q[x][y];//把目标矩阵赋值给临时矩阵
		 }
	 }
	//算法分析与思路
    min_count=m+n+1; //初始化变换次数为最坏情况
	 for(x=0;x&lt;n;x++) //大循环开始---枚举源矩阵每一列变换为目标矩阵每一列的情况,分别统计变换次数,取最少的那个。
	 {
		 for(a=0;a&lt;m;a++)
			 for(b=0;b&lt;n;b++)
			q[a][b]=r[a][b]; //每枚举一次都要将目标矩阵恢复原状。
			 count=0;
			 for(ii=0;ii&lt;m;ii++)
			 {
				 temp=q[ii][0];
				 q[ii][0]=q[ii][x];//把目标的每一列与第一列交换
                 q[ii][x]=temp;
			 }
			 if(0!=x)
				 count++;//如果有列转换就执行此句
			 for(a=0;a&lt;m;a++)
				 {
				if(p[a][0]!=q[a][0])//如果源矩阵不等于目标矩阵
				{
	               for(i3=0;i3&lt;n;i3++)
				   {	
		              if (q[a][i3]==0)
					  {
			            q[a][i3]=1;   // 金币翻转行
					  }
		              else 
					  {
			             q[a][i3]=0;
					  }	
				   }
	                  count++;//如果执行if语句有金币翻转
				}
			 } //count=2
			 for(a=0;a&lt;n;a++)//break2
			 {
				 match=false;
				 for(b=a;b&lt;n;b++)// break跳出 1
					{					
					if(song(a,b))//  如果两列相等
						{
            	for(i1=0;i1&lt;m;i1++)
				{
		           temp1=q[i1][a];
	            	q[i1][a]=q[i1][b];// 两列互换
		            q[i1][b]=temp1;
				}
	            if(a!=b)
	         	  count++;//目标与源列对比有相等但列的位置不一样执行
						match=true;				
						break;// 跳出1
					}
				}
				if(!match)// 如果找不到两列相等就执行此语句
					break; // 跳出 2
			}		
         if((match)&amp;&amp;(count&lt;min_count))
			 {				
				min_count=count;// 取最后成功匹配的值
			}
		}		
		
        if(min_count&lt;m+n+1)
		{
			fout&lt;&lt;min_count&lt;&lt;endl;
		}
		else
		{
			fout&lt;&lt;"-1"&lt;&lt;endl;
		}
			
	}
	delete[]p;
	delete[]q;
	delete[]r;
}
//判断两列是否相等
bool song(int x,int y)
{
	int i;
	for(i=0;i&lt;m;i++)	
	if(p[i][x]!=q[i][y])
	return false;
	return true;
}
</PRE></BODY></HTML>

⌨️ 快捷键说明

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