DFS深搜的剪枝。
题目大意,输入一个t(1 <= t < =5000)有t组测试数据,每一组测试数据,第一行输入n,m,k,(0 <=n , m <= 5 , 0 <= k <= 25)第二行 然后k个数,在n * m的矩阵中用着k中颜色填充每个格子,dii中颜色有有k[i]个,共n * m个颜色(注意是k种颜色,共有n * m个颜色),去填充着n*m个格子,每个格子的上向左右填充的颜色不能相同,要求找到一组这样的解,若存在一种解,则输出YES,然后输出每个单元填充的颜色,否则输出NO。若存在多种可行解,输出任意一种即可。
首先你肯定会想到dfs,去尝试用剩下的颜色填充某个格子,若将所有格子都填充完了,并且每个格子的上下左右都不相同,则这是可行解,否则就没有解。但是这一定会超时,你得有优秀的剪枝。最重要的剪枝:当前状态还剩下cnt个格子没有填,某种颜色剩下x个,若某个x大于格子数的一半,即x > (cnt + 1) / 2,则此次尝试一定是不行的。具体请读者画图尝试一下。
下面贴出代码,供大家参考。