题解 P1985 【[USACO07OPEN]翻转棋】

· · 题解

[ 更好的阅读体验 ]

[ 原题面 ]

第零部分 —— 阅读题目

第一部分 —— 开始分析

第二部分 —— 初现思路

第三部分 —— 深入思考

第四部分 —— 解决问题

第五部分 —— 代码实现

void Work(int k)
{
    if (!k) Doit();              // 全部枚举好了
    else
    {
        Work(k - 1);               // 递归不反转
        Reversal(1, k), ++b;       // 翻转一下,用来递归翻转情况
        Work(k - 1);               // 递归翻转
        Reversal(1, k), --b;       // 翻转一下,用来还原
    }
}
void Doit()
{
    Map = Shadow
    For (i = 1..n-1)
        For (j = 1..m)
            If (Map[i][j])
                Reversal(i+1,j),++p;//注意i从1到n-1
    Flag = 1;
    for (int j=1..m; Flag&=(!Map[n][j++]));     //判断最后一行是不是全为0
    if ((p+b<D || (p+b==D && Judger()) || D==-1) && Flag)
    {
        Ans = ans
        D = p+b
    }                                           //判断是否符合替换要求
    Shadow = Map
    Ans[2][1] ~ Ans[n][m] = 0
}

第六部分 —— 后记?

第七部分 —— 延伸阅读①

第八部分 —— 真·后记