poj2965 The Pilots Brothers' refrigerator(直接计算或枚举Enum+dfs)
转载请注明出处:http://blog.csdn.net/u012860063?
viewmode=contents
id=2965
----------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋:http://user.qzone.qq.com/593830943/main
----------------------------------------------------------------------------------------------------------------------------------------------------------
Description
The game “The Pilots Brothers: following the stripy elephant” has a quest where a player needs to open a refrigerator.
There are 16 handles on the refrigerator door. Every handle can be in one of two states: open or closed. The refrigerator is open only when all handles are open. The handles are represented as a matrix 4х4. You can change the state of a handle in any location [i,
j] (1 ≤ i, j ≤ 4). However, this also changes states of all handles in row i and all handles in column j.
The task is to determine the minimum number of handle switching necessary to open the refrigerator.
Input
The input contains four lines. Each of the four lines contains four characters describing the initial state of appropriate handles. A symbol “+” means that the handle is in closed state, whereas the symbol “−” means “open”. At least one of the handles is
initially closed.
Output
The first line of the input contains N – the minimum number of switching. The rest N lines describe switching sequence. Each of the lines contains a row number and a column number of the matrix separated by one or more spaces. If there are several solutions,
you may give any one of them.
Sample Input
-+--
----
----
-+--
Sample Output
6
1 1
1 3
1 4
4 1
4 3
4 4
转载():
证明:要使一个为'+'的符号变为'-',必须其对应的行和列的操作数为奇数;
能够证明,假设'+'位置相应的行和列上每个位置都进行一次操作,则整个图仅仅有这一'+'位置的符号改变,其余都不会改变.
> 设置一个4*4的整型数组,初值为零,用于记录每一个点的操作数,那么在每一个'+'上的行和列的的位置都加1,得到结果模2
(由于一个点进行偶数次操作的效果和没进行操作一样,这就是楼上说的取反的原理),
然后计算整型数组中一的
> 个数即为操作数,一的位置为要操作的位置(其它原来操作数为偶数的由于操作并不发生效果,因此不进行操作)
代码一例如以下:(直接计算结果)
#include <iostream>
#include <cstring>
using namespace std;
int map[5][5];
int ans;
char a[8];
void count(int i,int j)
{
int k;
for(k=0;k<4;k++)
{
map[i][k]++;
map[k][j]++;
}
map[i][j]--;//由于上面的for进行了两次map[i][j]++操作。此处减掉一次
}
void result()
{
ans=0;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
ans+=map[i][j]%2;
}
void output()
{
cout<<ans<<endl;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(map[i][j]%2==1)
cout<<i+1<<' '<<j+1<<endl;
}
int main()
{
memset(map,0,sizeof(map));
int i;
int j;
for(i=0;i<4;i++)
{
cin>>a;
for(j=0;j<4;j++)
if(a[j]=='+')
count(i,j);
}
result();
output();
return 0;
}
代码二(Enum+dfs)例如以下:
#include <cstring>
#include <iostream>
using namespace std;
//本题因为要输出每次翻转的棋子,因此不适宜用BFS,应该使用DFS输出完整路径
bool lock[10][10];
//实际仅仅用了当中的row3:→row6。col3:→col6。
bool flag;
int step;
int ri[17],cj[17];
bool isopen()
{
for(int i = 3; i < 7; i++)
{
for(int j = 3; j < 7; j++)
{
if(lock[i][j]!=true)
return false;
}
}
return true;
}
void flip(int row, int col)//改变状态
{
lock[row][col] = !lock[row][col];
for(int i = 3; i < 7; i++)
{
lock[i][col] = !lock[i][col];
}
for(int j = 3; j < 7; j++)
{
lock[row][j] = !lock[row][j];
}
return ;
}
void dfs(int row, int col, int deep)
{
if(step == deep)
{
flag = isopen();
return;
}
if(flag || row == 7)
return;
flip(row,col);
ri[deep] = row;//记录路径
cj[deep] = col;
if(col < 6)
dfs(row,col+1,deep+1);
else
dfs(row+1,3,deep+1);//从3開始的
flip(row,col);//假设不符合状态就改回来
if(col < 6)
dfs(row,col+1,deep);
else
dfs(row+1,3,deep);
return;
}
int main()
{
char temp;
int i, j;
memset(lock,false,sizeof(lock));
for(i = 3; i < 7; i++)
{
for(j = 3; j < 7; j++)
{
cin>>temp;
if(temp == '-')
{
lock[i][j] = true;
}
}
}
for(step = 0; step <= 16; step++)//枚举步数
{
dfs(3,3,0);
if(flag)
break;
}
cout<<step<<endl;
for(i = 0; i < step; i++)
{
cout<<ri[i]-2<<' '<<cj[i]-2<<endl;
}
return 0;
}
poj2965 The Pilots Brothers' refrigerator(直接计算或枚举Enum+dfs)的更多相关文章
- POJ - 2965 - The Pilots Brothers' refrigerator (高效贪心!!)
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19356 ...
- POJ 2965:The Pilots Brothers' refrigerator
id=2965">The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj 2965 The Pilots Brothers' refrigerator
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18040 ...
- poj 2965 The Pilots Brothers' refrigerator(dfs 枚举 +打印路径)
链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...
- 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个把手.每个手柄可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才 ...
- The Pilots Brothers' refrigerator-DFS路径打印
I - The Pilots Brothers' refrigerator Time Limit:1000MS Memory Limit:65536KB 64bit IO Format ...
- poj2965 The Pilots Brothers' refrigerator
题目链接:http://poj.org/problem?id=2965 分析:1.这道题和之前做的poj1753题目差不多,常规思路也差不多,但是除了要输出最少步数外,还要输出路径.做这道题的时候在怎 ...
- poj2965 The Pilots Brothers' refrigerator —— 技巧性
题目链接:http://poj.org/problem?id=2965 题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了.网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面 ...
随机推荐
- HDU 4345
细心点想,就明白了,题目是求和为N的各数的最小公倍数的种数.其实就是求N以内的各素数的不同的组合(包含他们的次方),当然,是不能超过N的.用Dp能解决.和背包差不多. #include <ios ...
- Maya 2012 破解安装全图文教程
在学习U3D的过程中.我们要用到Maya这个工具,(当然你也能够用其它类似的), 我在安装破解 Maya 2012 的过程其中,走了一些弯路.通过搜索发现,网上关于Maya 破解的文章大多语焉不详,为 ...
- hdu 4888 2014多校第三场1002 Redraw Beautiful Drawings 网络流
思路:一開始以为是高斯消元什么的.想让队友搞,结果队友说不好搞,可能是网络流.我恍然,思路立刻就有了. 我们建一个二部图.左边是行,右边是列,建个源点与行建边,容量是该行的和.列与新建的汇点建边.容量 ...
- android 虚拟按键是通过哪种机制上报的?
1.在normal mode下,tp button也是和其他触摸事件一样,以坐标形式的input_event进行上报.在初始化时会通过tpd_button_setting()函数依据定义在tpd_cu ...
- Registry Connect failed,Windows服务诊断
Message:Connection failed for 192.168.32.38_e-futrueserer. Details:Windows Registry Datasource: Regi ...
- spark Bisecting k-means(二分K均值算法)
Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...
- pyspark MLlib踩坑之model predict+rdd map zip,zip使用尤其注意啊啊啊!
Updated:use model broadcast, mappartition+flatmap,see: from pyspark import SparkContext import numpy ...
- 【POJ 1733】 Parity Game
[题目链接] http://poj.org/problem?id=1 [算法] 并查集 [代码] #include <algorithm> #include <bitset> ...
- 5. Longest Palindromic Substring[M]最长回文子串
题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum le ...
- Noip前紧急抢救
管他会不会,知道结论就好了 紧急抢救知识 斯特林数 第一类斯特林数 递推公式 \[ S[n][k]=(n-1)\times S[n-1][k]+S[n-1][k-1] \] 处理的问题是将n个数划分为 ...
