算法基础训练 50 题(四)搜索
#JC0401.# 自然数的拆分问题
利用回溯算法,每次都从1遍历到上限,并记录当前搜索的值以及总和。每当总和等于n时,输出所有记录的值。
1 | using namespace std; |
#JC0402.# 八皇后问题
利用回溯算法,因为每行、每列、每个对角线都不能放置棋子,但是搜索时是按行从上往下,所以只需要维护三个数组,分别记录别每列、每个对角线都是否放过棋子。在放置棋子时,用x+y表示所在的右斜对角线,用x-y+n表示左斜对角线(+n是防止结果为负数,超出数组下标范围)
1 | int n,a[20],x[20],y[20],b1[50],b2[50],ans; |
#JC0403.# Lake Counting S
该题可以用多次回溯来做,每一次回溯都会找到并标记连续的W,即一个水坑里的全部W,而对每个没有被标记的W,都进行一次回溯,最后会标记完所有的W,也就找到了所有的水坑。
用数组a来表示地图,数组b来表示w是否被标记过。每次回溯时都将能找到的W在b中标记,最后再遍历数组a,结合数组b寻找没有被标记过的W,进行下一次回溯。
1 | int n,m,ans; |
#JC0404.# 拯救oibh总部
可以将地图扩展至(0,0)到(n+1,m+1),最外面一圈填充0代表水坑,然后从坐标0,0开始,搜索连续的0并标记。最后再遍历整个地图,计数没有标记且为0的区域数量。
1 | int n,m,a[501][501],b[501][501],ans; |
#JC0405.# Need for Pink Slips
利用回溯,每次按照题目要求调整c,m,p的概率并在选中p时统计概率。回溯时传入c,m,p的概率,当前抽奖次数,当前的总概率。
1 | int t; |
#JC0407.# Catch That Cow S
本题利用广度优先搜索bfs,不断判断下一次移动是否会超出移动或到达已经移动过的地方,并将其加入到队列中,直到整个地图全被搜索完,然后输出牛所在的坐标的搜索深度。
1 | int x,y,t; |
#JC0408.# 马的遍历
本体利用dfs,不断判断下一次马移动是否会超出移动或到达已经移动过的地方,并将其加入到队列中,直到整个地图全被搜索完,然后输出每个坐标的搜索深度。
1 | int v[MAX+10][MAX+10]={-1,-1}; |