尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CSP-S 2023 密码锁 题解

CSP-S 2023 密码锁 题解 题意简述5 位密码锁每一位是 0‑9 环形9 下一个是 0。锁车操作从正确密码出发恰好执行一次操作操作二选一转动某 1 个拨圈任意幅度转动一对相邻拨圈两个拨圈转动幅度完全相同。现在给出 n 个锁车后的状态全部不等于正确密码。求有多少种 5 位密码满足给出的每一个状态都可以由该密码通过恰好一次合法锁车操作得到。数据范围1n8。题目分析由于总密码空间100000可以暴力枚举全部候选密码。核心函数详细解释boolcheck(inta[],intb[][5]){// 遍历每一个给出的锁后状态for(inti0;in;i){ints0;//统计a(正确密码)与b[i](锁后状态)有多少位不一样for(intj0;j5;j){if(b[i][j]!a[j])s;}// s0等于原密码题目说锁后状态不能是正确密码s2超过最多改动2位直接falseif(s2||s0)return0;if(s1)continue;//只改1位合法下一个状态// s2恰好两位不同必须是相邻偏移模10相等for(intj0;j5;j){if(b[i][j]!a[j]){// j位不同j1必须也要不同否则不是相邻两位if(b[i][j1]a[j1])return0;// 计算两个位置的偏移模10必须相等elseif((b[i][j]-a[j]10)%10(b[i][j1]-a[j1]10)%10){break;//满足条件退出j循环该状态合法}elsereturn0;//偏移不等非法}}}returntrue;//n个状态全部校验通过这是一个合法正确密码}注意j只会找到第一个不一样的下标要求j与j1同时不一样偏移相等就满足 “相邻两位改动、偏移相同”。完整AC代码#includebits/stdc.husingnamespacestd;intn,a[6],b[10][5],ans0;boolcheck(inta[],intb[][5]){for(inti0;in;i){ints0;for(intj0;j5;j){if(b[i][j]!a[j])s;}if(s2||s0)return0;if(s1)continue;for(intj0;j5;j){if(b[i][j]!a[j]){if(b[i][j1]a[j1])return0;elseif((b[i][j]-a[j]10)%10(b[i][j1]-a[j1]10)%10){break;}elsereturn0;}}}returntrue;}intmain(){cinn;for(inti0;in;i){for(intj0;j4;j){cinb[i][j];}}for(inti100000;i199999;i)//这里有一个枚举小技巧如果不想五重循环的话可以这样做。{intxi;for(intj4;j0;j--){a[j]x%10;x/10;}if(check(a,b)){ans;}}coutans;return0;}
返回列表