这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
1926. 迷宫中离入口最近的出口
思路分析
在已知这道题是一道广度优先遍历的题目的基础上,我们需要找到第一次小人到达非起点的迷宫边缘的步数。
如果每次到达边缘都在判断是否是墙的基础上,判断是否是起点,自然可以但并不优雅,所以可以通过将起点改为’+’的方式,让两次判断合并。
广度优先题中,何时标记数组某点为已读,何时根据队列中的点判断是否为答案,我觉得并不是一层不变的,如这道题中,我们判定条件为:边缘的’.’,而在广度层层遍历的时候,我们难免也需要进行一次边缘判断。
所以,两次判断同一件事无疑是没有必要的,因此我们可以将两次合并为一次
自然有:
while(q.size() != 0){
auto [cx, cy, d] = q.front();
q.pop();
for (int i = 0; i < 4; i++){
int cxn = cx + ls[i], cyn = cy + ls[i];
if (cxn == 0 || cxn == l - 1 || cyn == 0 || cyn == r - 1){
if (maze[cxn][cyn] == '.')return d+1;
}else if(cxn > 0 || cxn < l - 1 || cyn > 0 || cyn < r - 1){
if (maze[cxn][cyn] == '.'){
maze[cxn][cyn] = '+';
q.emplace(cxn, cyn, d + 1);
}
}
}
}
复制代码
一运行就傻了,一看用例原来是边缘操作时这个if判断会将越界的也计算进来,就会数组越界,看了眼答案,更加的和谐,但是顺着自己的逻辑很难想到。
1927 求和游戏
评论区大佬的思路分析
计算出两边的[问号数量差]和[数字和差],如果均为0,或者均在同一边则必输。
如果问好数差可以被数字和差弥补,则可以赢。
因此有一行代码
return ```
!((sum == 0 && cnt == 0) || (cnt % 2 == 0 && (sum ^ cnt) < 0 && Math.abs(sum) == Math.abs(cnt * 9) / 2))
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END