题解 UVA1603 【Square Destroyer】

题目链接:Link

Solution

废话不说,先贴代码.....

#include
#include
int n,m,maxd,cnt,sum;
int FullSize[625],Size[625];
bool sti[65],in[625][65];
inline int getc(int r,int c)// |  竖线
{
    return r*(2*n+1)+c+n+1;
}
inline int getr(int r,int c)//--   横线
{
    return r*(2*n+1)+c+1;
}
inline int FindNext()//找到下一个没有破坏的正方形
{
    for(int i=1;i<=cnt;i++)
        if(Size[i]==FullSize[i])
            return i;
    return 0;
}
void dfs(int d)//深搜
{
    if(d>=maxd) return;//最优性剪枝
    int next=FindNext();
    if(next==0)
    {
        maxd=d;
        return;
    }
    for(int i=1;i<=sum;i++)
        if(in[next][i])
        {
            for(int j=1;j<=cnt;j++)//删掉火柴棍
                if(in[j][i]) Size[j]--;
            dfs(d+1);
            for(int j=1;j<=cnt;j++)//复原
                if(in[j][i]) Size[j]++;
        }
}
int main()
{
#ifdef local
    freopen("pro.in","r",stdin);
#endif
    int kase;
    scanf("%d",&kase);
    while(kase-->0)
    {
        memset(in,0,sizeof(in));
        memset(sti,1,sizeof(sti));
        cnt=0;
        scanf("%d%d",&n,&m);
        int a,b,e,f;
        for(int i=0;i

转载于:https://www.cnblogs.com/happyZYM/p/11379996.html

你可能感兴趣的:(题解 UVA1603 【Square Destroyer】)