http://poj.org/problem?id=2965

好吧终于没有图片了,这道题看起来应该简单一些吧,毕竟已经有7000多人A了,好吧,还是先看看题目再说。
题目大意:
//还是吃过晚饭后再看吧
题目:飞行员兄弟的冰箱?(感觉恶搞的成分居多,在飞机上的冰箱???)
这个游戏“这个飞行员兄弟:有条纹的大象(????神马东西啊,难带是要把大象装冰箱??我去,那跟飞行员有毛线关系)”,有一个问题是参与者怎么打开冰箱。
打开冰箱的门有16个把手(好吧,我也是醉了,这什么冰箱),每个把手都有两种状态,打开或者关闭,只有所有的把手都打开的时候冰箱才会被打开(制造这种冰箱的人一辈子也卖不出去一台!!!),这些把手被处理成4*4的矩阵,你可以改变在i,j(1<=i,j<=4)坐标把手的状态,当然同时第i行j列的状态也会被改变(真心服了,这货是冰箱,敢不敢严谨一些。)
任务要求是找到最少的打开冰箱的操作。
‘+’代表关闭,‘-’代表打开。
/////////已经算是无语了,现在就是在想这道题跟做的第一题有什么区别啊?????好吧,区别真的不大。
先尝试写代码吧。
刚才看了输出,好吧我承认是有区别的,要把步骤带上,不过很明显可以用递归输出

错了两次,第一次时间超限,第二次是数组定义的太大(怀疑错的地方都一样)

#include<stdio.h>

#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std; #define maxn 70000 ////////////////不要定义太大,初始化不是不浪费时间的 struct node
{
    int x, y, k, pre;
}v[maxn]; int p[10][10]; int  changeNum(int a[][10]);//把二维数组转化成一个数字
void change();//构造异或数组
void changeXY(int x, int y, int a[][10]);//改变xy所在坐标的行和列
void FunOut(int pre);//输出前面的所有坐标
void BFS(); int  main()
{
    int i, j, a[10][10], m;
    char ch;     memset(v, 0, sizeof(v));
    BFS();     for(i=1; i<=4; i++)
    for(j=1; j<=4; j++)
    {
        cin >> ch;         if(ch == '-')
            a[i][j] = 0;
        else
            a[i][j] = 1;
    }     m = changeNum(a);     printf("%d\n", v[m].k-1);
    FunOut(m);     return 0;
}
int  changeNum(int a[][10])//把二维数组转化成一个数字
{
    int i, j, m=0;     for(i=1; i<=4; i++)
    for(j=1; j<=4; j++)
    {
        m = m*2 + a[i][j];
    }     return m;
} void FunOut(int pre)//输出前面的所有坐标
{
    if(pre== 0)
        return ;     FunOut(v[pre].pre);     printf("%d %d\n", v[pre].x, v[pre].y);
}
void BFS()
{
    queue<int> Q;
    v[0].k = 1;
    Q.push(0);     change();     while(Q.size())
    {
        int q = Q.front();Q.pop();         for(int i=1; i<=4; i++)
        for(int j=1; j<=4; j++)
        {
            int m = q ^ p[i][j];             if(v[m].k == 0)
            {
                v[m].k = v[q].k + 1;
                v[m].pre = q;
                v[m].x = i;
                v[m].y = j;                 Q.push(m);
            }
        }
    }
}
void changeXY(int x, int y, int a[][10])//改变xy所在坐标的行和列
{
    int i;     for(i=1; i<=4; i++)
    {
        a[x][i] = 1 - a[x][i];
        a[i][y] = 1 - a[i][y];
    }
    a[x][y] = 1 - a[x][y];
} void change()//构造异或数组
{
    int i, j, b[10][10] = {0};     for(i=1; i<=4; i++)
    for(j=1; j<=4; j++)
    {
        changeXY(i, j, b);
        p[i][j] = changeNum(b);
        changeXY(i, j, b);
    }
}

poj2569的更多相关文章

随机推荐

  1. SQL SERVER 查看死锁的存储过程

    end

  2. ios9 http请求失败的问题

    最近做项目的时候 将电脑版本升级到10.11.3  xcode'升级到 7.2  但是在模拟器上边进行数据请求的时候告诉我说网路哦有问题 截图如下 通过网络终于找到了解决的办法  原来是ios9 采用 ...

  3. javascript中常用的DOM事件

    //常用事件 onclick 点击事件 onmousedown 鼠标按下 onmousemove 鼠标移动 onmouseup 鼠标抬起 onmouseover 鼠标放上 onmouseout 鼠标放 ...

  4. SpringMVC4+thymeleaf3的一个简单实例(篇五:页面和MySql的数据交互-展示以及存储)

    这一篇将介绍怎样把页面数据保存的MySQL数据库,并将数据库内容展示到页面上.首先做一个基础工作,添加以下jar到lib:1: mysql-connector-Java-5.1.40-bin.jar ...

  5. Linq查询IEnumerable与IQueryable

    class Program { static void Main(string[] args) { System.Diagnostics.Stopwatch stp = new Stopwatch() ...

  6. CentOS Device eth0 does not seem to be present 解决方案

    1. vi /etc/udev/rules.d/70-persistent-net.rules 记录eth1 的网卡地址 2.vi /etc/sysconfig/network-scrpits/ifc ...

  7. Android 学习手札(二) 活动(Activity)组件

    1.建立和配置Activity 建立Android工程时已经自动生成了一个默认的Activity,同时也生成了很多与Activity相关的文件,例如,res目录中的XML及图像文件.AndroidMa ...

  8. centos6.5安装vsftp服务并配置虚拟账户ftp

      当我们的用户量越来越大时,继续创建更多的系统用户是不明智的,这时就需要为vsftpd创建虚拟账户,但vsftpd虚拟账户的数据库要保存在Berkeley DB格式的数据文件中,所以需要安装db4- ...

  9. Javascript参数传递中值和引用的一种理解

    值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...

  10. myisam和innodb区别

      InnoDB MyIsam 事务                        支持 不支持 锁 行锁 表锁 索引 B+树,数据和索引在一个文件中,必须有主键,如果不指定,会自动生成一个隐藏字段作 ...