POJ 2965&&1753

时间:2023-02-16 22:13:16

  最近由于复习备考(然而考得还是很炸),很久没打题目了。现在开始刷寒假作业,不得不搞POJ

  话说没有中文真的好烦啊!

  先看1753

  题目大意是说在一个4*4的格子中有黑白两色的棋子,你可以翻动其中的棋子但同时它四周(上下左右)的棋子也会被翻动,问你最少要翻几次才能翻成全黑或全白。

  首先要想到,一个棋子翻转偶数次就相当于没翻,翻了奇数次就相当于翻了一次(很好想到),最重要的是它们翻转的顺序对答案并无影响!

  所以一个棋子要么翻要么不翻,一共有2^(4*4)共65536种可能,直接爆搜即可。

  注意一下翻棋子时不要越界

  CODE

#include<cstdio>
#include<iostream>
using namespace std;
const int fx[]={,,,-,},fy[]={,,,,-};
char a[][];
int i,j,ans=;
inline bool check()
{
int w=,b=; char comp=a[][];
for (int i=;i<=;++i)
for (int j=;j<=;++j)
if (a[i][j]!=comp) return ;
return ;
}
inline void flip(int x,int y)
{
for (int i=;i<;++i)
{
int xx=x+fx[i],yy=y+fy[i];
if (xx<=||yy<=||xx>||yy>) continue;
if (a[xx][yy]=='w') a[xx][yy]='b'; else a[xx][yy]='w';
}
}
inline void DFS(int x,int y,int s)
{
if (check()) { ans=s<ans?s:ans; return; }
if (x>) return;
int xx=x,yy=y;
if (++yy>) ++xx,yy=;
flip(x,y);
DFS(xx,yy,s+);
flip(x,y);
DFS(xx,yy,s);
}
int main()
{
for (i=;i<=;++i)
for (j=;j<=;++j)
cin>>a[i][j];
DFS(,,);
if (ans!=) printf("%d",ans); else puts("Impossible");
return ;
}

  2965其实是一道基本相似的题目,也是在4*4的方格中把所有的开关都翻成‘-‘,每次翻一个就会使它所在的那一行和那一列都翻转。

  同样的做法,不过是开一个vector纪录一下答案而已。

  CODE

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector <int> ans_x,ans_y;
char a[][];
int i,j,ans=;
bool f[][];
inline void copy()
{
for (int i=;i<=;++i)
for (int j=;j<=;++j)
if (f[i][j]) ans_x.push_back(i),ans_y.push_back(j);
}
inline bool check()
{
int w=,b=;
for (int i=;i<=;++i)
for (int j=;j<=;++j)
if (a[i][j]!='-') return ;
return ;
}
inline void flip(int x,int y)
{
for (int i=;i<=;++i)
if (a[i][y]=='-') a[i][y]='+'; else a[i][y]='-';
for (int j=;j<=;++j)
if (a[x][j]=='-') a[x][j]='+'; else a[x][j]='-';
if (a[x][y]=='-') a[x][y]='+'; else a[x][y]='-';
}
inline void DFS(int x,int y,int s)
{
if (check())
{
if (s<ans)
{
ans=s;
ans_x.clear(); ans_y.clear();
copy();
}
return;
}
if (x>) return;
int xx=x,yy=y;
if (++yy>) ++xx,yy=;
flip(x,y);
f[x][y]=;
DFS(xx,yy,s+);
flip(x,y);
f[x][y]=;
DFS(xx,yy,s);
}
int main()
{
for (i=;i<=;++i)
for (j=;j<=;++j)
cin>>a[i][j];
DFS(,,);
printf("%d\n",ans);
for (i=;i<ans;++i)
printf("%d %d\n",ans_x[i],ans_y[i]);
return ;
}

POJ 2965&&1753的更多相关文章

  1. POJ 2965&period; The Pilots Brothers&&num;39&semi; refrigerator 枚举or爆搜or分治

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

  2. poj 2965 The Pilots Brothers&amp&semi;&num;39&semi; refrigerator(dfs 枚举 &plus;打印路径)

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

  3. 枚举 POJ 2965 The Pilots Brothers&&num;39&semi; refrigerator

    题目地址:http://poj.org/problem?id=2965 /* 题意:4*4的矩形,改变任意点,把所有'+'变成'-',,每一次同行同列的都会反转,求最小步数,并打印方案 DFS:把'+ ...

  4. poj 2965

    http://poj.org/problem?id=2965 本题要结合poj 1753 来看最好...又有了一点搜索的经验..加油... #include <iostream> #inc ...

  5. POJ 2965 The Pilots Brothers&&num;39&semi; refrigerator【枚举&plus;dfs】

    题目:http://poj.org/problem?id=2965 来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26732#pro ...

  6. poj 2965 The Pilots Brothers&&num;39&semi; refrigerator枚举&lpar;bfs&plus;位运算&rpar;

    //题目:http://poj.org/problem?id=2965//题意:电冰箱有16个把手,每个把手两种状态(开‘-’或关‘+’),只有在所有把手都打开时,门才开,输入数据是个4*4的矩阵,因 ...

  7. POJ 2965 The Pilots Brothers&&num;39&semi; refrigerator (枚举&plus;BFS&plus;位压缩运算)

    http://poj.org/problem?id=2965 题意: 一个4*4的矩形,有'+'和'-'两种符号,每次可以转换一个坐标的符号,同时该列和该行上的其他符号也要随之改变.最少需要几次才能全 ...

  8. poj 2965 The Pilots Brothers&&num;39&semi; refrigerator &lpar;dfs&rpar;

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

  9. POJ 2965 The Pilots Brothers&&num;39&semi; refrigerator【BFS&plus;状压 Or 脑洞】

    题目链接: http://poj.org/problem?id=1753 题意: 给定冰箱门的开关情况,改变一个门则其所在行列的门都会发生改变,求出改变门的最少操作使得最终所有门都是打开状态. 代码: ...

随机推荐

  1. HDU 5831 Rikka with Parenthesis II &lpar;贪心&rpar; -2016杭电多校联合第8场

    题目:传送门. 题意:T组数据,每组给定一个长度n,随后给定一个长度为n的字符串,字符串只包含'('或')',随后交换其中两个位置,必须交换一次也只能交换一次,问能否构成一个合法的括号匹配,就是()( ...

  2. Oracle的海量存储技术

    下午去參加一个Oracle有关海量数据存储技术的培训讲座了. 地址在广州市林和西路101号天河区计经大楼西側三楼. 培训发起机构为:广州中睿信息技术有限公司. 以下就简要总结一下所听到的一些东西,也算 ...

  3. ORA-12170&colon; TNS&colon;Connect timeout occurred

    VM 作为ORACLE 服务器,客户端登陆提示超时,本地连接使用网络连接正常. D:>sqlplus system/oracle123@//192.168.63.121:15021/pdb01 ...

  4. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程

    干净的终止一个线程  我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...

  5. react——一个todolist的demo

    代码如下: function ToDoListHeader(props) { return <h1 className={props.className}>ToDoList</h1& ...

  6. Android的Intent机制详解

    Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作.尽管 Intent 可以通过多种方式促进组件之间的通信,但其 基本用例主要包括以下三个: 启动 Activity: Activit ...

  7. 成熟的 Git 分支模型

    个人博客原文: 成熟的 Git 分支模型 今天介绍一下工作中会用到的 Git 分支模型. 先贴上图以表敬意 闲言 在学校不管是自己写课程设计还是给老师做项目,有 2 到 3 个人一起协作开发时就会使用 ...

  8. luogu P1578 奶牛浴场

    很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...

  9. 用JAVA写一个简单的英文加密器

    package qhs; import java.util.Scanner; public class JiaM { public static void main(String[] args) { ...

  10. 【Connection Events】【BLE】【原创】

    Connection Events  本人在TI官网的学习笔记,现整理如下   两台BLE设备建立连接后,所有的通信事件都是通过Connection Events中发生的           上图为两 ...