转载请注明出处:http://blog.csdn.net/u012860063?

viewmode=contents

题目链接:http://poj.org/problem?

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&#39; refrigerator(直接计算或枚举Enum+dfs)的更多相关文章

  1. POJ - 2965 - The Pilots Brothers&#39; refrigerator (高效贪心!!)

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19356 ...

  2. POJ 2965:The Pilots Brothers&#39; refrigerator

    id=2965">The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total S ...

  3. poj 2965 The Pilots Brothers&#39; refrigerator

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18040 ...

  4. poj 2965 The Pilots Brothers&#39; refrigerator(dfs 枚举 +打印路径)

    链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...

  5. POJ2965——The Pilots Brothers' refrigerator

    The Pilots Brothers' refrigerator Description The game “The Pilots Brothers: following the stripy el ...

  6. [POJ2965]The Pilots Brothers' refrigerator (搜索/位运算)

    题意 游戏“The Pilots Brothers:跟随有条纹的大象”有一个玩家需要打开冰箱的任务. 冰箱门上有16个把手.每个手柄可以处于以下两种状态之一:打开或关闭.只有当所有把手都打开时,冰箱才 ...

  7. The Pilots Brothers&#39; refrigerator-DFS路径打印

    I - The Pilots Brothers' refrigerator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format ...

  8. poj2965 The Pilots Brothers' refrigerator

    题目链接:http://poj.org/problem?id=2965 分析:1.这道题和之前做的poj1753题目差不多,常规思路也差不多,但是除了要输出最少步数外,还要输出路径.做这道题的时候在怎 ...

  9. poj2965 The Pilots Brothers' refrigerator —— 技巧性

    题目链接:http://poj.org/problem?id=2965 题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了.网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面 ...

随机推荐

  1. POJ 2407

    裸 的求欧拉函数 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  2. java连接数据库核心代码

    一.oracle String driver = "oracle.jdbc.driver.OracleDriver"; String url = "jdbc:Oracle ...

  3. 自己定义控件三部曲之动画篇(十三)——实现ListView Item进入动画

    前言:宝剑锋从磨砺出,梅花香自苦寒来 相关文章: <Android自己定义控件三部曲文章索引>: http://blog.csdn.net/harvic880925/article/det ...

  4. Python标准库:内置函数callable(object)

    假设对象object參数是能够调用的对象,就返回True.否则返回False.只是要注意的是,当一个对象是能够调用的.并不表示调用该对象时运行一定成功,但不可调用的对象去调用时一定不会成功.假设类对象 ...

  5. 视差滚动demo (pc)

    根据设计图设定每屏的高度,js会自动缩放到全屏尺寸,效果要大尺寸才能看的出来 demo :http://runjs.cn/detail/uvizsekd <!DOCTYPE html> & ...

  6. BZOJ 4321 DP

    思路: 这个DP太神了- 完全没想到 http://blog.csdn.net/geotcbrl/article/details/49663401 //By SiriusRen #include &l ...

  7. Java 开源博客 —— Solo 0.6.9 发布了!

    Solo 是 GitHub 上 Star 数最多的 Java 博客系统,今天我们发布了 0.6.9 正式版,欢迎大家下载. 特性 基于标签的文章分类 博客/标签 Atom/RSS.Sitemap 输出 ...

  8. Error:Execution failed for task ':app:processDebugManifest'. 合并冲突

    1. Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attrib ...

  9. iOS的流畅性

    1优先级别不同:iOS最先响应屏幕 优先级别不同:iOS最先响应屏幕 当我们使用iOS或者是Android手机时,第一步就是滑屏解锁找到相应程序点击进入.而这个时候往往是所有操控开始的第一步骤,iOS ...

  10. Python2以及Python3中的除法

    前言 在讨论话题之前,我们先说下程序中除法的三种情况: 1. 传统的除法,我称之为整型地板除.在C.C++.Java中常见,特点是整数相除舍弃小数取整,浮点数相除则保留小数(如果有). >> ...