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. 【POJ2886】【线段树】Who Gets the Most Candies?

    Description N children are sitting in a circle to play a game. The children are numbered from 1 to N ...

  2. 『重构--改善既有代码的设计』读书笔记----Introduce Foreign Method

    当你无法获得一个类的源代码或者没有权限去修改这个类的时候,你对于这种为你服务的类,你可能会出现需要别的需求的时候,比如一个Date类,你需要能够让他本身直接返回出他的后一天的对象,但他没有,这个时候你 ...

  3. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)

    前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...

  4. underscorejs-shuffle学习

    2.21 shuffle 2.21.1 语法 _.shuffle(list) 2.21.2 说明 返回一个随机乱序的list副本数组, 使用 Fisher-Yates shuffle 来进行随机乱序. ...

  5. Easyui的combobox组件无法选择内容

    我切换combobox的内容的时候,老是选中的是第一行的数据,因为我渲染的时候没有给它valueField和textField的字段,而默认的又不是我要求的. 加上就好了. $("#tool ...

  6. Html5新增加的属性

    用2中方法给单复选框增加新的特性,使直接点击文字就可以被选中 1.将选项放入label标签内添加for属性,并在input标签内添加id,两者值相同. 2.将input标签放到label标签内,注意l ...

  7. ThinkPHP框架下,给jq动态添加的标签添加点击事件移除标签

    jq移除标签主要就是$("#要移除的id").remove();不再赘述,这里要提醒的是jq中动态添加标签后怎样添加点击事件.一般的jq添加点击事件是用这种方法$("#i ...

  8. PHP面向对象(OOP):抽象方法和抽象类(abstract)

    在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口.而抽象方法就是为了方便继承而引入的,我们先来看一下抽象类和抽象方法的定义再说明它的用途. 什么是抽象方 ...

  9. JavaScript解析机制

    JavaScript是一种解释型语言,按照<script>块儿来预编译和执行. JavaScript解释器在预编译阶段,先预声明变量,再预声明函数.在执行阶段,进行变量赋值,和函数执行. ...

  10. 转:.NET中使用Redis (二)

    原文来自于:http://blog.jobbole.com/83824/ 原文出处: 寒江独钓   欢迎分享原创到伯乐头条 很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务 ...