zju 1008

这道题目是一个DFS题目

 

要注意搜索的方向,因为要保证结果是搜出一个符合条件的正方形

 

所以,可以 从第一行 按列搜索,再换行,一直到 row+1 行的时候,跳出循环

 

// 我是 从 r=0,c=0开始的,所以r=n-1,c=n-1是最右下角

//已经压缩过了的

bool dfs(int r,int c)
{
    if(r==n)  //跳出
        return true;
    for(int i=0;i<dif;i++)
    {
       if(map[i].count)
        if((r==0||map[i].up==map[coord[r-1][c]].down)&&(c==0||map[i].left==map[coord[r][c-1]].right)) //符合条件
        {
            coord[r][c]=i;  // 第r+1行,c+1列 是 第i个小正方形
            map[i].count--; //第i个小正方形数目减去1
            if(c==n-1) //到最右边了
             {
                if(dfs(r+1,0)) //换行搜索
                    return true;
             }
            else
                if(dfs(r,c+1)) //不换行,按列搜索
                    return true;
            map[i].count++;
        }
    }
    return false;
}

 

干脆贴出代码吧

 

 

 

 

 

 

 

代码还有许多可以优化的地方,比如在dfs里面的那个for(i=0;i<dif;i++)

 

我可以先建立一个临界表.....

 

就会避免许多不必要的搜索时间了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值