poj2965 The Pilots Brothers' refrigerator —— 技巧性
题目链接:http://poj.org/problem?id=2965
题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了。网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面不够优化,那超时很正常。看来这题用dfs和bfs都不是好办法。 然后又看到比较厉害的技巧:“可知翻偶数次等于没翻,即没有翻的必要,翻奇数次的结果与翻一次的结果一样“”。有了这个重要结论,那么可以具体操作了:设一个二维数组以记录每个的翻转次数。对于每个‘+’,都翻转其所在的行列(注意‘+’只翻一次),然后更新翻转次数。最后统计翻转次数为奇数的,即为实际需要翻转的。(为什么我没想到这种方法。需要仔细体会这种思维)
代码如下:
- #include<stdio.h>//poj2965
- #include<string.h>
- int main()
- {
- int a[][],sum;
- char map[][];//map开一维已足够
- memset(a,,sizeof(a));
- for(int i = ; i<; i++)
- {
- scanf("%s",map[i]);
- for(int j = ; j<; j++)
- {
- if(map[i][j]=='+')
- {
- a[i][j]--;//‘+’在下面的步骤中翻了两次,要减少一次
- for(int k = ; k<; k++)
- {
- a[k][j]++;
- a[i][k]++;
- }
- }
- }
- }
- sum = ;
- for(int i = ; i<; i++)
- for(int j = ; j<; j++)
- {
- if(a[i][j]%) sum++;
- }
- printf("%d\n",sum);
- for(int i = ; i<; i++)
- for(int j = ; j<; j++)
- {
- if(a[i][j]%)
- printf("%d %d\n",i+,j+);
- }
- }
对了,附上自己wa了的dfs和bfs;
dfs:
- #include<cstdio>//poj 2965dfs 超时未过
- #include<cstring>
- #define MIN(a,b) (a<b?a:b)
- int a[],ans[];
- int get()
- {
- for(int i = ; i<; i++)
- if(a[i]) return ;
- return ;
- }
- void flip(int loc)
- {
- int x = loc/, y = loc%;
- a[loc] = !a[loc];
- for(int k = ; k<; k++)
- a[x*+k] = !a[x*+k];
- for(int k = ; k<; k++)
- a[k*+y] = !a[k*+y];
- }
- int dfs(int loc,int step,int tar)
- {
- if(loc>) return ;
- if(step==tar && get())
- return ;
- else
- {
- flip(loc);
- ans[step] = loc;
- if(dfs(loc+,step+,tar)) return ;
- flip(loc);
- if(dfs(loc+,step,tar)) return ;
- }
- return ;
- }
- int main()
- {
- int t;
- char s[];
- memset(ans,-,sizeof(ans));
- for(int i = ; i<; i++)
- {
- scanf("%s",s);
- for(int j = ; j<; j++)
- {
- if(s[j]=='+') a[i*+j] = ;
- else a[i*+j] = ;
- }
- }
- int i;
- for(i = ; i<=; i++)
- {
- if(dfs(,,i)) break;
- }
- printf("%d\n",i);
- for(int k = ; k<i; k++)
- {
- if(ans[k]!=-)
- printf("%d %d\n",ans[k]/+, ans[k]%+);
- }
- return ;
- }
bfs:(bfs的队列可能不够大,溢出。用stl的话又怎么记录路径呢?)
- #include<cstdio>//poj 2965 bfs 未过
- #include<cstring>
- #include<queue>
- using namespace std;
- int ss,vis[],pre[];
- struct node
- {
- int status, step,loc;
- };
- node q[];
- void calcul( node *next,int i)
- {
- if(next->status&(<<i)) next->status -= (<<i);
- else next->status += (<<i);
- }
- void turn (node *next,int i)
- {
- calcul(next,i);
- int xi = i/, yi = i%;
- for(int k = ; k<; k++)
- calcul(next,xi*+k);
- for(int k = ; k<; k++)
- calcul(next,k*+yi);
- }
- int bfs()
- {
- int front = , rear = ;
- q[front].status = ss, q[front].step = ;
- vis[q[front].status] = ;
- if(q[front].status==)
- return front;
- memset(vis,,sizeof(vis));
- memset(pre,,sizeof(pre));
- while(front<rear)
- {
- for(int i = ; i<; i++)
- {
- q[rear].status = q[front].status;
- turn(&q[rear],i);
- if(vis[q[rear].status]) continue;
- q[rear].loc = i;
- q[rear].step = q[front].step + ;
- pre[rear] = front;
- vis[q[rear].status] = ;
- if(q[rear].status==) return rear;
- rear++;
- }
- front++;
- }
- return -;
- }
- void pri_path(int rear)
- {
- if(q[rear].step>) pri_path(pre[rear]);
- printf("%d %d\n",q[rear].loc/+, q[rear].loc%+);
- }
- int main()
- {
- int t;
- char s[];
- ss = ;
- for(int i = ; i<; i++)
- {
- scanf("%s",s);
- for(int j = ; j<; j++)
- {
- if(s[j]=='+') ss += <<(i*+j);
- }
- }
- int rear = bfs();
- printf("%d\n",q[rear].step);
- pri_path(rear);
- return ;
- }
poj2965 The Pilots Brothers' refrigerator —— 技巧性的更多相关文章
- POJ2965——The Pilots Brothers' refrigerator
The Pilots Brothers' refrigerator Description The game “The Pilots Brothers: following the stripy el ...
- [POJ2965]The Pilots Brothers' refrigerator (搜索/位运算)
题意 游戏“The Pilots Brothers:跟随有条纹的大象”有一个玩家需要打开冰箱的任务. 冰箱门上有16个把手.每个手柄可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才 ...
- poj2965 The Pilots Brothers' refrigerator
题目链接:http://poj.org/problem?id=2965 分析:1.这道题和之前做的poj1753题目差不多,常规思路也差不多,但是除了要输出最少步数外,还要输出路径.做这道题的时候在怎 ...
- POJ 2965 The Pilots Brothers' refrigerator 暴力 难度:1
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16868 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ2965The Pilots Brothers' refrigerator(枚举+DFS)
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22057 ...
- The Pilots Brothers' refrigerator(dfs)
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19718 ...
- 枚举 POJ 2965 The Pilots Brothers' refrigerator
题目地址:http://poj.org/problem?id=2965 /* 题意:4*4的矩形,改变任意点,把所有'+'变成'-',,每一次同行同列的都会反转,求最小步数,并打印方案 DFS:把'+ ...
- The Pilots Brothers' refrigerator 分类: POJ 2015-06-15 19:34 12人阅读 评论(0) 收藏
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20304 ...
随机推荐
- JAVA Eclipse创建Android程序界面不显示怎么办
一般是由于你创建的Android应用程序版本太高导致的,请设置4或以下版本,对于已有的项目,可以在属性-Android中修改目标生成的版本号 ...
- 每天学点Python之bytes
每天学点Python之bytes Python中的字节码用b'xxx'的形式表示.x能够用字符表示,也能够用ASCII编码形式\xnn表示.nn从00-ff(十六进制)共256种字符. 基本操作 以下 ...
- js 中文校验并过滤掉中文
js中文校验并过滤掉中文 CreateTime--2017年9月6日09:10:19 Author:Marydon 思路: 1.判断字符串中是否包含中文: 2.存在中文时,过滤掉. 举例: var ...
- Sql 复习3之存储管理
一.事务管理 单个工作单元称为事务,我们将若干条sql命令组合在一起,形成存储过程.触发器等,利用存储过程和触发器可以进行事务管理. 二.编程基础介绍 主要有:函数.程序设计语句等. 程序设计语句: ...
- Web安全系列(二):XSS 攻击进阶(初探 XSS Payload)
什么是 XSS Payload 上一章我谈到了 XSS 攻击的几种分类以及形成的攻击的原理,并举了一些浅显的例子,接下来,我就阐述什么叫做 XSS Payload 以及从攻击者的角度来初探 XSS 攻 ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- HBase——完全分布
实际上,在真实环境中你需要使用完全分布配置完整测试HBase.在一个分布式配置中,集群有多个节点,每个节点运行一个或多个HBase守护进程.其中包括主Master和备份Master实例,多个Zooke ...
- 利用GROUP_CONCAT函数把相同信息的合并到同一个字段中
SELECT a.*,GROUP_CONCAT(b.pri_name) FROM sh_role a LEFT JOIN sh_privilege b ON FIND_IN_SET(b.id,a.pr ...
- Unity编辑器扩展之RequireComponent等详解
RequireComponent的使用: 当你添加的一个用了RequireComponent组件的脚本,需要的组件将会自动被添加到game object(游戏物体).这个可以有效的避免组装错误.举个例 ...
- 微信小程序页面布局之弹性布局-Flex介绍
布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现. 2009年,W3C 提出了一种新 ...