【习题 7-6 UVA - 12113】Overlapping Squares

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

先预处理出来一个正方形。
然后每次枚举新加的正方形左上角的坐标就可以。
注意覆盖的规则,控制一下就可以。
然后暴力判断是否相同。
暴力回溯即可(只用回溯一个正方形区域)

【代码】

/*
    1.Shoud it use long long ?
    2.Have you ever test several sample(at least therr) yourself?
    3.Can you promise that the solution is right? At least,the main ideal
    4.use the puts("") or putchar() or printf and such things?
    5.init the used array or any value?
    6.use error MAX_VALUE?
    7.use scanf instead of cin/cout?
    8.whatch out the detail input require
*/
/*
    一定在这里写完思路再敲代码!!!
*/
#include <bits/stdc++.h>
using namespace std;

const int N = 10;
const int M = 5;

char s[N+5][N+5],now[N+5][N+5];
char square[M+5][M+5];

void init(){
    for (int i = 0;i <3;i++)
        for (int j = 0;j<5;j++)
            square[i][j] = ' ';
    for (int i = 0;i < 2;i++) square[i+1][0] = square[i+1][4] = '|';
    for (int j = 1;j < 5;j+=2) square[0][j]=square[2][j] = '_';
}

void Set(int x,int y){
    for (int i = 0;i < 3;i++)
        for (int j = 0;j < 5;j++){
            if (i<=0 && now[i+x][j+y]!=' ' && square[i][j]==' ') continue;
            now[i+x][j+y] = square[i][j];
        }
    for (int i = 1;i < 2;i++)
        for (int j = 1;j<4;j++)
            now[i+x][j+y] = ' ';

}

bool ok(){
    for (int i = 0;i < 5;i++)
        for (int j = 0;j < 9;j++)
            if (now[i][j]!=s[i][j])
                return false;
    return true;
}

void out(){
    for (int i = 0;i < 5;i++){
        for (int j = 0;j < 9;j++)
            cout <<now[i][j];
        cout << endl;
    }
    cout << endl;

}

bool dfs(int dep){
    if (dep > 1 && ok()) return true;
    if (dep >= 7) return false;
    int temp[M+5][M+5];
    for (int i = 0;i < 3;i++){
        for (int j = 0;j < 5;j+=2){
            for (int k = 0;k <3;k++)
                for (int l = 0;l < 5;l++)
                    temp[k][l] = now[k+i][l+j];
            Set(i,j);
            if (dfs(dep+1)) return true;
            for (int k = 0;k <3;k++)
                for (int l = 0;l < 5;l++)
                    now[k+i][l+j] = temp[k][l];
        }
    }
    return false;
}

int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    init();
    int kase = 0;
    while (1){
        for (int i = 0;i < 5;i++){
            cin.getline(s[i],15);
            if (s[i][0]=='0') return 0;
        }
        for (int i = 0;i< 5;i++)
            for (int j = 0;j < 9;j++)
                now[i][j] = ' ';
        if (dfs(1)){
            cout <<"Case "<<++kase<<": Yes"<<endl;
        }else{
            cout <<"Case "<<++kase<<": No"<<endl;
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/8158198.html

时间: 2024-10-09 00:48:41

【习题 7-6 UVA - 12113】Overlapping Squares的相关文章

UVA 12113 Overlapping Squares

题意: 总共有6个2*2的正方形,判断是否能够成所给的形状. 思路: 一个正方形总共有9种摆放方式,对于整个地图来说摆放方式总共有2的9次方种摆放方式.然后将地图用9*5的数组表示,正方形的位置用其8个边的下标和4个中空的下标表示. 代码: #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int bian[9][8]={

UVA - 12113 Overlapping Squares(dfs+回溯)

题目: 给定一个4*4的棋盘和棋盘上所呈现出来的纸张边缘,问用不超过6张2*2的纸能否摆出这样的形状. 思路: dfs纸的张数,每一张中枚举这张纸左上角这个点的位置,暴力解题就可以了. 这个题的覆盖太恶心了,很容易搞混~~~(因为搞混一直TLE+WA----) 代码: #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define MAX 1000000000 #define mod 1000000007 #define FRE() freope

【UVA】201 Squares(模拟)

题目 题目 ? ? 分析 记录一下再预处理一下. ? ? 代码 #include <bits/stdc++.h> int main() { int t=0,s,n; while(scanf("%d",&s)==1) { if(t!=0) printf("\n**********************************\n\n"); int ans[11],H[21][21],V[21][21]; memset(V,0,sizeof(V))

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(i

习题3-5 Puzzle UVA - 227

这题太能卡人了,都是输入输出卡的. 1.输入的5X5矩阵中,有时一行最后有多个空格和回车 2.输出格式中,每两个输出结果之间间隔一个空行,但是最后一个结果之后没有空行. 3.有时到第四位元素,直接不按空格,直接换行了. 其实思路很简单,先判断是否运动越界,如果是的话就输出无答案,如果没越界,就依次将空格和目标位置元素相互交换. 下面是AC代码,就是把这些小BUG修修补补改出来的,抛砖引玉吧. #include <bits/stdc++.h> #define N 7 #define M_N 10

算法竞赛入门经典第二版第三章习题

写这个的原因是看到一位大神的习题答案总结,于是自己心血来潮也想写一个这个,目的主要是督促自己刷题吧,毕竟自己太弱了. 习题3-1 得分 UVa 1585 大致就是设置一个变量记录到当前为止的连续的O的数量,碰到X就变0,水题. #include<stdio.h> #include<ctype.h> #include<string.h> char s[90]; int main(void) { int length,n,sum,num; scanf("%d&qu

ACM-ICPC Dhaka Regional 2012 题解

B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每个地点经过的次数(维护一个栈就可以了,注意进入起点和离开起点都不算入起点的次数) #include<cstdio> #include<cstring> #include<stack> #include<iostream> #include<algorithm> using

USACO2013January(乱做)

由于不清楚来源,题目乱放: Problem 1: Mirrors [Brian Dean and Travis Hance, 2013] Farmer John's cows have been causing too much trouble around the farm, andFJ therefore wants to keep a more watchful eye on them.  By installing Nreflective fences (1 <= N <= 200)

【转】[专题学习][计算几何]

原文地址:http://www.cnblogs.com/ch3656468/archive/2011/03/02/1969303.html 基本的叉积.点积和凸包等东西就不多说什么了,网上一搜一大堆,切一些题目基本熟悉了就差不多了. 一些基本的题目可以自己搜索,比如这个blog:http://blog.sina.com.cn/s/blog_49c5866c0100f3om.html 接下来,研究了半平面交,思想方法看07年朱泽园的国家队论文,模板代码参考自我校大牛韬哥: http://www.o