zoukankan      html  css  js  c++  java
  • UVA-12113 Overlapping Squares (回溯+暴力)

    题目大意:问能不能用不超过6张2x2的方纸在4x4的方格中摆出给定的图形?

    题目分析:暴力枚举出P(9,6)种(最坏情况)方案即可。

    代码如下:

    # include<iostream>
    # include<cstdio>
    # include<cstring>
    # include<algorithm>
    using namespace std;
    
    int vis[10];
    char mp[8][15],p1[8][15];
    
    bool judge()
    {
        for(int i=0;i<5;++i)
            for(int j=0;j<9;++j)
                if(mp[i][j]!=p1[i][j])
                    return false;
        return true;
    }
    
    bool dfs(int step)
    {
        if(judge())
            return true;
    
        if(step>=6)
            return false;
    
        char p2[6][10];
        for(int i=0;i<5;++i)
            for(int j=0;j<9;++j)
                p2[i][j]=p1[i][j];
    
        for(int i=0;i<9;++i){
            if(vis[i])
                continue;
    
            vis[i]=1;
            int r=i/3,c=2*(i%3)+1;
            p1[r][c]=p1[r][c+2]=p1[r+2][c]=p1[r+2][c+2]='_';
            p1[r+1][c-1]=p1[r+2][c-1]=p1[r+1][c+3]=p1[r+2][c+3]='|';
            p1[r+1][c]=p1[r+1][c+1]=p1[r+1][c+2]=p1[r+2][c+1]=' ';
    
            if(dfs(step+1))
                return true;
    
            vis[i]=0;
            for(int i=0;i<5;++i)
                for(int j=0;j<9;++j)
                    p1[i][j]=p2[i][j];
        }
    
        return false;
    }
    
    int main()
    {
        int cas=0;
        while(1)
        {
            for(int i=0;i<5;++i){
                gets(mp[i]);
                if(mp[i][0]=='0')
                    return 0;
            }
            printf("Case %d: ",++cas);
    
            for(int i=0;i<5;++i)
                for(int j=0;j<9;++j)
                    p1[i][j]=' ';
    
            memset(vis,0,sizeof(vis));
            if(dfs(0))
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    Windows下Rails2.0.2最简安装教程
    xmpp with openfire之三 openfire扩展小试 整合现有系统用户
    母亲的电话
    郁闷……
    博弈
    长春下雪了
    监考
    sql把逗号分隔的字符串拆成临时表
    SQL语句使用大全。
    Left Join、Right Join、Inner Join的区别
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/4817702.html
Copyright © 2011-2022 走看看