文档章节

高手是怎样炼成的 4

寒瑟
 寒瑟
发布于 2014/12/22 15:57
字数 1072
阅读 11
收藏 0
C
#include<stdio.h>
int X=3;
int Y=4;
//int FROM[4][3]={{1,0,1},{0,0,0},{1,1,0},{1,0,1}};
//int TO[4][3]={{1,0,1},{1,1,1},{0,1,1},{1,0,1}};
int FROM[4][3]={{1,0,1},{0,0,0},{1,0,0},{1,1,1}};
int TO[4][3]={{1,0,0},{1,1,1},{1,1,0},{1,1,1}};
int TEMP[4][3];
void print_matrix()
{
 int i,j;
 printf("TEMP MATRIX:--------------------\n");
 for(i=0;i<Y;i++)
 {
  for(j=0;j<X;j++)
  {
   printf("%d ",FROM[i][j]);
  }
  printf("\n");
 }
}
void count_temp()
{
 int i,j;
 for(i=0;i<Y;i++)
 {
  for(j=0;j<X;j++)
  {
   TEMP[i][j]=TO[i][j]^FROM[i][j];
  }
 }
}
int line_transform()
{
 int i,j,count=0,n1,n2;
 for(i=0;i<Y;i++)
 { 
  n1=0;
  n2=0;
  for(j=0;j<X;j++)
  {
   if (FROM[i][j]==1)
    n1++;
   if (TO[i][j]==1)
    n2++;
  }
  if((n1+n2)==X)
  {
   printf("the %d line should flip!\n",i);
   for(j=0;j<X;j++)
   {
    if(FROM[i][j]==0) 
     FROM[i][j]=1;
    else
     FROM[i][j]=0;
   }
   count++;
  }
 }
 return count;
}
int column_transform()
{
 int i,j,k,flag,count=0,temp;
 for(i=0;i<X-1;i++)
 { 
  for(k=i;k<X;k++)
  {
   flag=1;
   for(j=0;j<Y;j++)
   {
    if(TO[j][i]!=FROM[j][k])
    {
     flag=0;
     break;
    }
    
   }
   if(flag==1 && i!=k)
   {
    printf("exchange %d column and %d column\n",i,k);
    for(j=0;j<Y;j++)
    {
     temp=FROM[j][i];
     FROM[j][i]=FROM[j][k];
     FROM[j][k]=temp;
    }
    count++;
   }
  }
 }
 return count;
}
int check_temp()
{
 int i,j;
 for(i=0;i<Y;i++)
  for(j=0;j<X;j++)
   if(TEMP[i][j]!=0)
    return -1; 
 return 0;
}
int main()
{
 int line,column,res;
 line=line_transform();
 print_matrix();
 column=column_transform();
 print_matrix();
 res=check_temp();
 if(res==-1)
  printf("can not find a way transform it!");
 else
  printf("it takes at least %d steps to transfome!",line+column);
 return 0;
}

http://blog.csdn.net/will_lee_buaa/article/details/8530493

下面是一种错误的方法:

根据题目给出的金币变换规则,以及每行对应的每一列元素要么为0要么为1,可以发现以下规律:

1、如果初始状态经过若干步变换,能够转换成目标状态,则初始状态的第i行和目标状态的第i行的1的个数要么相等要么两者之和等于n(列的个数)。

因此,首先可以对初始状态的每行进行预处理,将初始状态的第i行和目标状态的第i行的1进行比较,如果两者之和为n,则将初始状态进行行变换,如果两者1的个数相等,则不变换,如果既不相等,两者之和也不等于n,则程序直接返回-1,结束运行,初始状态不可能转换成目标状态。(此处分析忽略了一点,如果列n为偶数,并且初始状态的第i行和目标状态的第i行的1的个数分别为n/2,这时就可能出错,因为这种情况满足两者1的个数相等和两者之和为n这两种情况,就没法确定该不该进行行变换

2、初始状态经过行预处理之后,再进行列的处理。从初始状态的列中找出和目标状态第一列相同的列,然后初始状态中的此列和初始状态的第一列交换,如何初始状态中没有和目标状态第一列相同的列,则终止程序运行返回-1。按照第一列的方法依次进行第2列

到第n列的处理。

对上面预处理的方法:n1+n2=X,且n1=n2,我们两种情况都算即可:先尝试不变换若得到一条路径,则打印路径,若没得到则尝试变换,若得到打印路径,否则,返回-1;预处理的方法确实简单很多!!!

© 著作权归作者所有

寒瑟
粉丝 1
博文 15
码字总数 5665
作品 0
浦东
私信 提问
怎样才能炼成iOS开发高手呢?

怎样才能炼成iOS开发高手呢? 本菜鸟认为: 1、忘记baidu.com,胸上纹上google.com 2、用Google时,搜索框内不要附加任何非英文标识符号(若英文不好,我只能说你是一只可怜的小小小鸟,努力...

晨曦之光
2012/05/28
180
0
每天Excel技巧-培训教程更新至32集

一、Excel高手是这样炼成的系列动画教程 已更新至32节,请查看 还在不断逐步更新中....... 二、Excel技巧详细每节链接 Excel高手是这样炼成-老李每日技巧 001填充序号-Excel , 002伪日期的处...

tmtony8
2018/06/29
0
0
51CTO首页周末博客头条记录(2012年)

12.28 [一探究竟,项目为什么会失败?][2012精彩无末日,重生展望2013] [有话跟老板说吗?发给我吧][ 12.21 [奋斗与快乐共享][会的多,会的精,你选择哪个?] [Hadoop的虚拟化之恋][IT女孩的...

懒小米
2018/06/29
0
0
第31届NIPS正式开幕,3240篇提交论文创历史新高,公布3篇最佳论文

美国时间12月4日,第31届NIPS在美国加州长滩的会展中心正式开幕! 之所以NIPS广受关注,是因为它在人工智能和机器学习领域具有重要地位,来自全世界的计算机科学家及资深业内人士将在接下来的...

dqcfkyqdxym3f8rb0
2017/12/05
0
0
007-第十四篇-跃迁成为高手的技术读后感上

007-014-1.png 0、作者介绍 古典 300万册畅销书《拆掉思维里的墙》作者,罗辑思维“得到”App专栏《超级个体》主理人。新精英生涯公司创始人,顶尖个人事业发展顾问,著名生涯规划师、生涯规...

韬声依旧在路上
2017/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部