转载请注明出处: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. 【Android 应用开发】 ActionBar 样式具体解释 -- 样式 主题 简单介绍 Actionbar 的 icon logo 标题 菜单样式改动

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/3926916 ...

  2. 关于部门后端所有转向java前初步设想

    Java服务有些什么形式?眼下来看主要是下面几类: 1.  执行在Web应用server的Servlet 2.  Thrift.PB.Avro等相似框架写的java服务 3.  WebService( ...

  3. UVA - 11021 - Tribles 递推概率

    GRAVITATION, n.“The tendency of all bodies to approach one another with a strengthproportion to the ...

  4. Ruby学习笔记(二)——从管道读取数据

    在对文件名修改后,今天又给自己出了新的难题,想从实验结果中提取数据,并将其作为文件夹的名称.其中,比赛的主办方提供的评估算法是用perl写的,因此读取实验结果最为简单的想法自然是使用管道命令,即 ./ ...

  5. 英语发音规则---K字母

    英语发音规则---K字母 一.总结 一句话总结: 1.K发[k]音? kind [kaɪnd] n. 种类 bike [baɪk] n. 自行车 skate [skeɪt] vi. 滑冰 make [ ...

  6. 杂项-Java:Spring

    ylbtech-杂项-Java:Spring Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.Spring是于200 ...

  7. 子线程中刷新了UI

    This application is modifying the autolayout engine from a background thread, which can lead to engi ...

  8. 基于Doxygen的C/C++注释原则

    基于Doxygen的C/C++注释原则 标注总述 .文件头标注 . 命名空间标注 . 类.结构.枚举标注 . 函数注释原则 . 变量注释 . 模块标注 . 分组标注 总述 华丽的分隔线 //----- ...

  9. 一个vue的全局提示框组件

    <template> <!-- 全局提示框 --> <div v-show="visible" class="dialog-tips dia ...

  10. SQL基本语句:1.模式 3.索引

    每次很长时间不用sql语句之后,都需要把基础的捡一捡,索性做个笔记,以后可以长看