首页 > 其他分享 >破坏正方形

破坏正方形

时间:2023-05-13 20:25:42浏览次数:32  
标签:dep return 破坏 int len st 正方形

破坏正方形

首先计算出火柴总数正方形总数

考虑横着的火柴有 \(n+1\) 行,每行有 \(n\) 根,竖着的同理(旋转 \(90°\)),所以一共有 \(2n(n+1)\) 根火柴。

边长为 \(1\) 的正方形有 \(n^2\) 个,\(2,(n-1)^2;3,(n-2)^2;\dots;n,1^2\),\(\sum_{i=1}^n i^2=\dfrac{n(n+1)(2n+1)}{6}\) 。所以共有这么多正方形。

然后分析题目。这是一个重复覆盖问题(不存在多项式做法,经典做法:Dacing Links)。可以抽象出一个二维矩阵,每一列代表所有的正方形,每一行代表每一根火柴,\((i,j)\) 表示第 \(i\) 根火柴是否是第 \(j\) 个正方形的边。这道题就用朴素做法。

首先搜索顺序很简单,就按照没有被破坏的正方形进行搜索,可以按照从小到大的边长,因为小的边长分支会少一些(之前许多搜索题目的共性),枚举边上的火柴即可。估价函数根据 Dacing Links 中的,是枚举每个正方形,如果是完整的,就删除所有边,并算作删除一次。显然这个估价是正确的。

还有就是如果快速求出某个正方形的边。左右相差 \(1\) 根,上下则跨过 \(n\) 横 \(n+1\) 竖,共 \(2n+1\) 根。

#include<bits/stdc++.h>
using namespace std;
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=r;i>l;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define wh(i) while(i--)
const int N=61;
int T,n,m;
vector<int>s[N];
bool st[N];
bool check(int x){
    for(int v:s[x])
        if(st[v])return 0;
    return 1;
}
int f(){
    static bool state[N];
    memcpy(state,st,sizeof st);
    int cnt=0;
    L(i, m){
        if(check(i)){
            ++cnt;
            for(int v:s[i])st[v]=1;
        }
    }
    memcpy(st,state,sizeof st);
    return cnt;
}
bool dfs(int dep,int max_dep){
    if(dep+f()>max_dep)return 0;
    L(i, m){
        if(check(i)){
            for(int v:s[i]){
                st[v]=1;
                if(dfs(dep+1,max_dep))return 1;
                st[v]=0;
            }
            return 0;
        }
    }
    return 1;
}
int main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    // ios::sync_with_stdio(0);
    // cin.tie(0);
    // cout.tie(0);
    scanf("%d",&T);
    wh(T){
        memset(st,0,sizeof st);
        m=0;
        scanf("%d",&n);
        int d=2*n+1;
        Ls(len, 1, n+1)
            Ls(a, 1, n+2-len)
                Ls(b, 1, n+2-len){
                    auto &sq=s[m++];
                    sq.clear();
                    L(i, len){
                        sq.push_back((a-1)*d+b+i);
                        sq.push_back((a-1)*d+b+i+len*d);
                        sq.push_back((a-1)*d+b+n+i*d);
                        sq.push_back((a-1)*d+b+n+i*d+len);
                    }
                }
        int k;
        scanf("%d",&k);
        wh(k){
            int x;
            scanf("%d",&x);
            st[x]=1;
        }
        int dep=0;
        while(!dfs(0, dep))++dep;
        printf("%d\n",dep);
    }
    return 0;
}

标签:dep,return,破坏,int,len,st,正方形
From: https://www.cnblogs.com/wscqwq/p/17398089.html

相关文章

  • 将小米8搞成破坏机之路
    1.从咸鱼花个300左右入手一套小米82.默认已经root,且已经装了LSposed3.卸载一些没有用的内置软件4.打开开发者模式,设置》关于手机〉找到“MIUI版本号”并连续点击七次。这将激活开发者模式5.登录小米账号,以及插入sim卡, 这一步做为了打开usb调试以及安装功能。小米搞......
  • LeetCode 473 火柴拼正方形
    LeetCode|473.火柴拼正方形你将得到一个整数数组matchsticks,其中matchsticks[i]是第i 个火柴棒的长度。你要用所有的火柴棍 拼成一个正方形。你不能折断任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须使用一次。如果你能使这个正方形,则返回true,否则返......
  • js基础---数组操作(破坏性改变数组)
    数组元素的crudpush():像数组末尾添加一个或多个元素并返回数组的新长度pop():删除并返回数组的最后一个元素unshift():像数组的开头添加一个或多个元素,并返回数组的长度shift:删除并返回数组的第一个元素splice(1,3,“111”):删除添加插入替换数组中的元素.(删除包括第一个坐标元素后面的三......
  • 【DP】LeetCode 1277. 统计全为 1 的正方形子矩阵
    题目链接1277.统计全为1的正方形子矩阵思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1......
  • 【DP】LeetCode 221. 最大正方形
    题目链接221.最大正方形思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nu......
  • 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
    在做这道题之前我们先了解一下棋盘问题棋盘问题(qq.com)......
  • 【LeetCode回溯算法#extra01】集合划分问题【火柴拼正方形、划分k个相等子集、公平发
    火柴拼正方形https://leetcode.cn/problems/matchsticks-to-square/你将得到一个整数数组matchsticks,其中matchsticks[i]是第i个火柴棒的长度。你要用所有的火柴棍拼成一个正方形。你不能折断任何一根火柴棒,但你可以把它们连在一起,而且每根火柴棒必须使用一次。如......
  • 1139. 最大的以 1 为边界的正方形
    题目链接:1139.最大的以1为边界的正方形方法:二维数组前缀和解题思路假设以\((i,j)\)为左上角端点的正方形网格边长为\(d\),则该正方形的四条边\(up、down、left、right\)均为\(d\),两者为充分必要条件。根据二维前缀和运算可得:up=s[i][j+d]-s[i-1][j+d]-s[i......
  • [HAOI2007]理想的正方形【题解】
    题目描述有一个\(a\timesb\)的整数组成的矩阵,现请你从中找出一个\(n\timesn\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小。输入格式第一行为\(3\)个整数,分别表示\(a,b,n\)的值。第二行至第\(a+1\)行每行为\(b\)个非负整数,表示矩阵中相应位置上......
  • 【服务器数据恢复】raid5多块硬盘离线导致存储的卷无法挂载,EXT3文件系统元数据被破坏
    服务器数据恢复环境&故障:某企业一台存储设备,一组由16块硬盘组建的raid5磁盘阵列。管理员在巡检过程中发现该存储的卷无法挂载,经过检查发现存储设备的raid5磁盘阵列中有2块硬盘离线。服务器数据恢复过程:1、检查该存储当前状态,通过storagemanager将存储的日志状态备份。2、将存......