zoukankan      html  css  js  c++  java
  • The Pilots Brothers' refrigerator (POJ 2965)

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

    这个题目和上一道题目差不多,暴搜可解。

    代码如下:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    //还要记录成功翻牌时的坐标顺序
    struct point
    {
    int x;
    int y;
    }order[16];//按照顺序记下翻牌的坐标
    char m[4][9];//+是关,-表示开
    int value[4][4];
    int limit,ok=0;
    int check()
    {
    if(ok)return 1;
    for(int i=0;i<4;i++)
    for(int k=0;k<4;k++)
    if(value[i][k]){ok=0;return 0;}
    return 1;//返回一表示成功了
    }
    void change(int x,int y)
    {
    for(int i=0;i<4;i++)
    {
    value[x][i]=!value[x][i];
    value[i][y]=!value[i][y];
    }
    value[x][y]=!value[x][y];
    }
    void dfs(int x,int y,int step)
    {
    if(step==limit)//这里写成if(step==limit&&check())就会超时,谁知道是为什么啊?????大神来踩我一下哈!不胜感激了
    {
    ok=check();//printf("%d %d ",limit,check());
    return;
    }
    if(x<0||y<0||x>=4||y>=4||ok)return;
    change(x,y);
    order[step+1].x=x;
    order[step+1].y=y;
    if(x<=2)dfs(x+1,y,step+1);
    else dfs(0,y+1,step+1);
    if(ok)return;
    change(x,y);
    if(x<=2)dfs(x+1,y,step);
    else dfs(0,y+1,step);
    return;
    }
    int main()
    {
    for(int i=0;i<4;i++)
    scanf("%s",m[i]);
    for(int i=0;i<4;i++)
    for(int k=0;k<4;k++)
    {
    if(m[i][k]=='-')value[i][k]=0;
    else value[i][k]=1;
    }
    for(limit=0;limit<=16;limit++)
    {
    dfs(0,0,0);
    if(ok)break;
    }
    if(ok)
    {
    printf("%d ",limit);
    for(int i=1;i<=limit;i++)
    printf("%d %d ",order[i].x+1,order[i].y+1);
    }
    else printf("Impossible ");
    return 0;
    }

  • 相关阅读:
    RedMine 1.3.3 安装攻略
    .net 4.0 framework 安装时发生严重错误
    MYSQL安装配置
    接口隔离ISP
    依赖倒置DIP
    VS2010添加WP模板
    VS2012尝鲜
    OCP开放闭合
    单一职责
    里氏替换
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3208434.html
Copyright © 2011-2022 走看看