第一次作业金币问题

//trans.cpp郁闷测试老是超时,运行效率不合格

#include <iostream.h>
#include <fstream.h>
#define   MAXN   100
int flag[MAXN]    ={0};  
int cflag[MAXN]  ={0};
int rflag[MAXN]  ={0};
int sa[MAXN][MAXN]={0};
int da[MAXN][MAXN]={0};
int ta[MAXN][MAXN]={0};

int ac=0;//数据组数
int rc=0;//行数
int cc=0;//列数
int r=-1;

int countTrans();
void switchArray();
int compare(int rowNo,int rf);
void trans(int s);
void main(){
 int ai,i,j;
 int * result;
 ifstream infile("input.txt");
 ofstream outfile("output.txt");
 infile>>ac;
 result=new int[ac];
 for(ai=0;ai<ac;ai++){
  result[ai]=-1;
  r=-1;
  infile>>rc;
  infile>>cc;
  
  //初始化源数组
  
  for(i=0;i<rc;i++){
   for(j=0;j<cc;j++){
    infile>>sa[i][j];
   }
  }
  //初始化目标数组
  for(i=0;i<rc;i++){
   for(j=0;j<cc;j++){
    infile>>da[i][j];
   }
  }
  trans(0);
  result[ai]=r;
 }
 
 for(i=0;i<ac;i++){
  cout<<result[i]<<endl;
  outfile << result[i]<<endl;
 }

 //释放结果空间
 delete result;
 infile.close();
 outfile.close();
}
void trans(int k){
 int revc=0;//翻转次数
 int exc=0;//换列次数
 int i;
 //int j;
 bool f=false;
  if(k==cc){
   switchArray();
   revc=0;
   exc=0;
   for(i=0;i<rc;i++){
    if((-1==compare(i,0))&& (-1==compare(i,1))){
   f=true;
   break;
  }else if(1==compare(i,1)){
   revc++;
  }

   }
 if(!f){
  exc=countTrans();
  if(r>=0){
   if(revc+exc<r)r=revc+exc;
  }else{
   r=revc+exc;
  }
 }
 return;
  }
  for(i=0;i<cc;i++) {
   if(flag[i])
    continue;  
 flag[i]=1;  
 cflag[k]=i; 
  
    trans(k+1);
    flag[i]=0; 
  }
}

int compare(int rowNo,int rf){
 int rt=1;
 int j;
 
 if(0==rf){
  for(j=0;j<cc;j++){
   if(sa[rowNo][cflag[j]]!=da[rowNo][j]){
   //if(ta[rowNo][j]!=da[rowNo][j]){
    rt=-1;
    break;
   }
  }
 }
 else if(1==rf){
  for(j=0;j<cc;j++){
   if((sa[rowNo][cflag[j]]+1)%2!=da[rowNo][j]){
   //if((ta[rowNo][j]+1)%2!=da[rowNo][j]){
    rt=-1;
    break;
   }
  }
 }else{
  rt=-1;
 }
 return rt;
}

int countTrans(){
 int rt=0;
 for(int i=0;i<cc;i++){
  if(cflag[i]>i)rt++;
 }
 return rt;
}

void switchArray(){
 int i,j;
 for(i=0;i<rc;i++){
  for(j=0;j<cc;j++){
   
    ta[i][j]=sa[i][cflag[j]];
  }
 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值