题目描述
CE数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。
为了涂色,APM需要使用一组刷子。每个刷子涂一种不同的颜色C。APM拿起一把有颜色C的刷子,并给所有颜色为C且符合下面限制的矩形涂色:
为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色。例如图中矩形F必须在C和D涂色后才能涂色。注意,每一个矩形必须立刻涂满,不能只涂一部分。
写一个程序求一个使APM拿起刷子次数最少的涂色方案。注意,如果一把刷子被拿起超过一次,则每一次都必须记入总数中。
输入输出格式
输入格式:
第一行为矩形的个数N。下面有N行描述了N个矩形。每个矩形有5个整数描述,左上角的y坐标和x坐标,右下角的y坐标和x坐标,以及预定颜色。
颜色号为1到20的整数。
平板的左上角坐标总是(0, 0)。
坐标的范围是0..99。
N小于16。
输出格式:
输出至文件paint.out,文件中记录拿起刷子的最少次数。
输入输出样例
输入样例#1:
7
0 0 2 2 1
0 2 1 6 2
2 0 4 2 1
1 2 4 4 2
1 4 3 6 1
4 0 6 4 1
3 4 6 6 2
输出样例#1:
3
蒟蒻看到这题,先是mengbi,表示不会DP,只能搜索(+剪枝)
这数据竟然过了(n<16)
搜索思路
读入数据,统计颜色,然后每个颜色都试一遍,即把该颜色的且能涂的砖涂上。
下一次涂色不能涂上次涂过的色。涂完了记录结果
你这不会超时吗老铁
为了不超时,加了两个剪枝
- 最优化剪枝:当前涂色次数大于等于当前答案,直接退出(这个好理解吧)
- 可行性剪枝:如果当前一个砖都没有涂到,直接退出(如果接着搜,会多一个次数,可能还会死循环,,,)
至于判断该砖是否能涂,先预处理,把紧邻该砖上方的砖用数组记录下来,再判断那些砖是否被涂
代码如下(格式丑勿喷)