3、17笔记

费解的开关:

  1. 枚举情况求最值、最优解的套路:

卡壳原因:套路的细节不熟悉

1.1

在枚举情况前,变量设置res,求最小值要设置一个大的数0x3f3f3f3f,最大值要设置小的数

枚举的每一种情况里要设置一个变量来统计这种情况的值,数量,末尾要和res比较

枚举完后再输出

1.2如果枚举的是操作情况,在枚举前要对被操作对象备份,操作后要还原对象

        int res = 0x3f3f3f3f;
        memcpy(backup,f,sizeof f);
        // 错误:备份的位置错误,应该输入后再备份,对备份的位置不熟悉
        for(int op = 0;op < 32;op++){
            int cnt = 0; 
            for(int i = 0;i < 5;i++)//卡壳,不熟悉位运算枚举开关点按情况的操作
            {
                if(op >> i & 1){
                    turn(0,i);
                    // 错误,这题下表用了0~4,对第一行操作应该是0才对,没有确认好下标
                    //卡壳,不熟悉位运算枚举里的坐标获取;
                    cnt++;
                }
            }
            for(int i = 0;i < 4;i++){
                for(int j = 0;j < 5;j++){
                    if(f[i][j] == '0'){
                        turn(i+1,j);
                        cnt++;
                    }
                }
            }
            bool all_turn_on = true;
            for(int i = 0;i < 5;i++){
                if(f[4][i] == '0') all_turn_on = false;
            }
            if(all_turn_on) res = min(res,cnt);

            // 错误:res应该是在所有可能都枚举完后才判断是否没有符合题意的res要赋值-1的
            memcpy(f,backup,sizeof f);
        }
        if(res > 6) res = -1;
        cout << res << endl;

  1. 输入数据与变量数据类型选择的套路

卡壳原因,见过没总结,踩陷阱了,题目输入的点阵之间没有空格,我没有注意到这个点,用int读入数据,结果直接把整一行当做一个数字读入了

如果输入的数据之间没有空格,要把数据当作字符来读取,不能用整型或浮点型来读取

char f[N][N];

for(int i = 0;i < 5;i++){
            for(int j = 0;j < 5;j++){
                cin >> f[i][j];
            }
        }

  1. 坐标移动的枚举套路

卡壳原因:不熟悉套路的细节,没有判断边界

int dx[] = {1,-1,0,0,0},dy[] = {0,0,1,-1,0};
    for(int i = 0;i < 5;i++){
        int a = x + dx[i];
        int b = y + dy[i];
        if(a < 0 || a >=5 || b < 0 || b >=5)continue;
        // 错误:没有判断边界,对坐标移动的相关注意点不熟
        //         if (a < 0 || a >= 5 || b < 0 || b >= 5) continue;   // 在边界外,直接忽略即可
        f[a][b] ^= 1;
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值