搜索

DFS

最常用的搜索算法,一般用递归实现。

BFS

状态空间中的BFS搜索,和图上的BFS很类似,都可以用队列来实现。

伪代码:

bfs(s) {
  q = new queue()
  q.push(s), visited[s] = true
  while (!q.empty()) {
    u = q.pop()
    for each edge(u, v) {
      if (!visited[v]) {
        q.push(v)
        visited[v] = true
      }
    }
  }
}

二分搜索

这个也简单,非常常用。

int binary_search(int start, int end, int key) {
  int ret = -1;  // 未搜索到数据返回-1下标
  int mid;
  while (start <= end) {
    mid = start + ((end - start) >> 1);  // 直接平均可能会溢出,所以用这个算法
    if (arr[mid] < key)
      start = mid + 1;
    else if (arr[mid] > key)
      end = mid - 1;
    else {  // 最后检测相等是因为多数搜索情况不是大于就是小于
      ret = mid;
      break;
    }
  }
  return ret;  // 单一出口
}

搜索与模拟习题

习题
T191062深基15.例2寄包柜普及-
T190986NOIP-J火星人2004普及/提高-
T191059深基9.例4求第k小的数普及/提高-
T191596NOIP-J立体图2008普及/提高-
T191601USACO SilverMeteor Shower2008普及/提高-
T191602数独普及/提高-
T191061JLOI不重复数字2011普及+/提高
T191599绘制二叉树普及+/提高
T191598NOIP-S时间复杂度2017普及+/提高
T191600NOIP-S字串变换2002普及+/提高
T191603NOIP-SMayan游戏2011提高+/省选-
T191605NOIP-S旅行2018提高+/省选-
T191606BalticOISwitch the Lamp On2011提高+/省选-
T198834魔板提高+/省选-