转载请注明出处: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. Linux环境thinkphp配置以及数据源驱动改动

    项目中须要用到thinkphp,以下简称tp. linux版本号:64位CentOS 6.4 Nginx版本号:nginx1.8.0 php版本号:php5.5.28 thinkphp版:3.2.3 ...

  2. Linux 查找一个函数在哪调用

    grep "function has" -R ThinkPHP

  3. Oracle学习(二):过滤和排序

    1.知识点:能够对比以下的录屏进行阅读 SQL> --字符串大写和小写敏感 SQL> --查询名叫KING的员工信息 SQL> select * 2 from emp 3 where ...

  4. idea使用技巧资料篇

    基本使用:https://my.oschina.net/lujianing/blog/177042#OSC_h1_2 解决idea卡顿问题:http://www.cnblogs.com/ae6623/ ...

  5. php面向对象之构造函数和析构函数

    php面向对象之构造函数和析构函数 简介 php面向对象支持两种形式的构造函数和析构函数,一种是和类同名的构造函数(php5.5之前),一类是魔术方法(php5.5之后).与类名相同的构造函数优先级比 ...

  6. zzulioj--1613--少活一年?(稍微有点坑,水!)

    1613: 少活一年? Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 344  Solved: 70 SubmitStatusWeb Board De ...

  7. MySQL 5.7 zip 文件安装过程

    1.下载路径 https://dev.mysql.com/downloads/mysql/   有账号登陆下载, 没有账号:no thanks;just start my download   2.解 ...

  8. Response.Redirect(),Server.Transfer(),Server.Execute()的区别与网站优化

    转 http://blog.csdn.net/dannywj1371/article/details/10213631 1.Response.Redirect():Response.Redirect方 ...

  9. ffmpeg键盘命令响应程序详解

    一.对终端进行读写 当一个程序在命令提示符中被调用时, shell负责将标准输入和标准输出流连接到你的程序, 实现程序与用户间的交互.   1. 标准模式和非标准模式 在默认情况下, 只有用户按下回车 ...

  10. [转]SQL Server 批量完整备份

    最近我们的服务器需要迁移,服务器上有很多数据库,有很多都不知道干什么的了,但是为了保险起见,我决定都备份下,起初我是右键一个一个备份的,备份三四个还好,可是数据库太多了,而且手动一步一步操作,还得修改 ...