DFS
AcWing 842. 排列数字
package main
import (
"bufio"
"fmt"
"os"
)
var (
path []int
vis = 0
)
func _debug() {
path = []int{}
vis = 0
n := ri()
back(n)
}
func back(n int) {
if len(path) == n {
for _, x := range path {
fmt.Fprint(out, x, " ")
}
fmt.Fprint(out, "\\n")
return
}
for j := 1; j <= n; j++ {
if (vis>>j)&1 == 1 {
continue
}
path = append(path, j)
vis |= (1 << j)
back(n)
path = path[:len(path)-1]
vis &= ^(1 << j)
}
}
// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0
var (
_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB rc rs rsn
)
func rc() byte { // faster read one byte
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
func ri() (x int) { // faster read int, support negative
neg := false
b := rc()
for ; '0' > b || b > '9'; b = rc() {
// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
if b == eof {
return
}
if b == '-' {
neg = true
}
}
for ; '0' <= b && b <= '9'; b = rc() {
x = x*10 + int(b&15)
}
if neg {
return -x
}
return
}
var (
in *bufio.Reader // 搭配Fscan使用
// in *bufio.Scanner
out *bufio.Writer
)
func main() {
in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
// ===== ===== fast io ===== =====
_debug()
}
AcWing 843. n-皇后问题
package main
import (
"bufio"
"fmt"
"os"
)
func _debug() {
n := ri()
tmp := make([]byte, n)
for i := range tmp {
tmp[i] = '.'
}
grid := make([][]byte, n)
for i := range grid {
grid[i] = make([]byte, n)
copy(grid[i], tmp)
}
dfs(grid, 0, n)
}
func dfs(grid [][]byte, row, n int) {
if row == n {
for _, row := range grid {
fmt.Fprintln(out, string(row))
}
fmt.Fprintln(out)
return
}
for i := 0; i < n; i++ {
if isvalid(grid, row, i, n) {
grid[row][i] = 'Q'
dfs(grid, row+1, n)
grid[row][i] = '.'
}
}
}
func isvalid(grid [][]byte, row, col int, n int) bool {
// 检查列
for i := 0; i < row; i++ {
if grid[i][col] == 'Q' {
return false
}
}
// 检查斜角
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
if grid[i][j] == 'Q' {
return false
}
}
// 检查斜角
// 检查斜角
for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {
if grid[i][j] == 'Q' {
return false
}
}
return true
}
// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0
var (
_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB rc rs rsn
outs = make([]byte, 0, 1e6*22) // 或者创建一个全局 array _o,然后 outS := _o[:0](效率几乎一样)
tmps = [64]byte{} // 可根据绝对值的十进制长度的上限调整
)
func rc() byte { // faster read one byte
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
func ri() (x int) { // faster read int, support negative
neg := false
b := rc()
for ; '0' > b || b > '9'; b = rc() {
// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
if b == eof {
return
}
if b == '-' {
neg = true
}
}
for ; '0' <= b && b <= '9'; b = rc() {
x = x*10 + int(b&15)
}
if neg {
return -x
}
return
}
var (
in *bufio.Reader // 搭配Fscan使用
out *bufio.Writer
)
func main() {
in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
// ===== ===== fast io ===== =====
_debug()
}
BFS
AcWing 844. 走迷宫
package main
import (
"bufio"
"fmt"
"os"
)
func _debug() {
n, m := ri(), ri()
grid := make_two_dimen(n, m)
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
grid[i][j] = ri()
}
}
bfs(grid)
}
func bfs(grid [][]int) {
q := [][]int{}
dist := make_two_dimen_with_val(len(grid), len(grid[0]), -1)
q = append(q, []int{0, 0})
dist[0][0] = 0
for len(q) != 0 {
x := q[0][0]
y := q[0][1]
q = q[1:]
for _, d := range directions {
dx := x + d[0]
dy := y + d[1]
if isok(grid, dx, dy) && grid[x][y] == 0 && dist[dx][dy] == -1 {
dist[dx][dy] = dist[x][y] + 1
q = append(q, []int{dx, dy})
}
}
}
fmt.Fprintln(out, dist[len(grid)-1][len(grid[0])-1])
}
var directions = [4][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} // 四个遍历方向
func isok(grid [][]int, i, j int) bool { // 判断是否在二维数组越界
return i >= 0 && i < len(grid) && j >= 0 && j < len(grid[0])
}
// 创建指定维度的二维数组
// n: rows; m: cols
func make_two_dimen(n, m int) (ans [][]int) {
ans = make([][]int, n)
for i := range ans {
ans[i] = make([]int, m)
}
return
}
// 创建指定维度的二维数组,并赋特定值
func make_two_dimen_with_val(n, m, val int) (ans [][]int) {
tmp := make([]int, m)
for i := range tmp {
tmp[i] = val
}
ans = make([][]int, n)
for i := range ans {
ans[i] = make([]int, m)
copy(ans[i], tmp)
}
return
}
// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0
var (
_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB rc rs rsn
outs = make([]byte, 0, 1e6*22) // 或者创建一个全局 array _o,然后 outS := _o[:0](效率几乎一样)
tmps = [64]byte{} // 可根据绝对值的十进制长度的上限调整
)
func rc() byte { // faster read one byte
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
func ri() (x int) { // faster read int, support negative
neg := false
b := rc()
for ; '0' > b || b > '9'; b = rc() {
// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
if b == eof {
return
}
if b == '-' {
neg = true
}
}
for ; '0' <= b && b <= '9'; b = rc() {
x = x*10 + int(b&15)
}
if neg {
return -x
}
return
}
var (
in *bufio.Reader // 搭配Fscan使用
out *bufio.Writer
)
func main() {
in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
// ===== ===== fast io ===== =====
_debug()
}
AcWing 845. 八数码
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func _debug() {
start := make([]byte, 9)
for i := range start {
start[i] = rsn(1)[0]
}
q := [][]byte{}
dist := map[string]int{}
q = append(q, start)
dist[string(start)] = 0
for len(q) != 0 {
cur := q[0] // []byte
q = q[1:]
distance := dist[string(cur)]
if string(cur) == "12345678x" {
fmt.Fprintln(out, distance)
return
}
idx := strings.Index(string(cur), "x")
x := idx / 3
y := idx % 3
for _, d := range directions {
dx := x + d[0]
dy := y + d[1]
if !_isok(dx, dy, 3, 3) {
continue
}
idx_new := dx*3 + dy
cur[idx], cur[idx_new] = cur[idx_new], cur[idx]
if _, ok := dist[string(cur)]; !ok {
dist[string(cur)] = distance + 1
tmp := append([]byte{}, cur...)
q = append(q, tmp) // copy and append
}
cur[idx], cur[idx_new] = cur[idx_new], cur[idx]
}
}
fmt.Fprintln(out, -1)
}
var directions = [4][2]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}} // 四个遍历方向
func _isok(i, j int, n, m int) bool {
return i >= 0 && j >= 0 && i < n && j < m
}
// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0
var (
_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB rc rs rsn
outs = make([]byte, 0, 1e6*22) // 或者创建一个全局 array _o,然后 outS := _o[:0](效率几乎一样)
tmps = [64]byte{} // 可根据绝对值的十进制长度的上限调整
)
func rc() byte { // faster read one byte
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
// 读一个长度为 n 的仅包含小写/大写字母的字符串,必要时进行修改
func rsn(n int) []byte {
b := rc()
// 只读取大小写字母和数字
for ; !('a' <= b && b <= 'z') && !('A' <= b && b <= 'Z') && !('0' <= b && b <= '9'); b = rc() { // 'A' 'Z'
}
s := make([]byte, 0, n)
s = append(s, b)
for i := 1; i < n; i++ {
s = append(s, rc())
}
return s
}
var (
in *bufio.Reader // 搭配Fscan使用
out *bufio.Writer
)
func main() {
in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
// ===== ===== fast io ===== =====
_debug()
}
树与图的深度优先遍历
AcWing 846. 树的重心
package main
import (
"bufio"
"fmt"
"os"
)
func _debug() {
const eof = 0
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
_i, _n, buf := 0, 0, make([]byte, 1<<12) // 4KB
// 读一个字符
rc := func() byte {
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
// 读一个整数,支持负数
ri := func() (x int) {
neg := false
b := rc()
for ; '0' > b || b > '9'; b = rc() {
// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
if b == eof {
return
}
if b == '-' {
neg = true
}
}
for ; '0' <= b && b <= '9'; b = rc() {
x = x*10 + int(b&15)
}
if neg {
return -x
}
return
}
_ = []interface{}{rc, ri}
n := ri()
g := make([][]int, n+1)
for i := 0; i < n-1; i++ {
a, b := ri(), ri()
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
st := make([]bool, n+1)
dfs(1, st, g)
fmt.Fprintln(out, ans)
}
var (
ans int = 1<<31 - 1
)
func dfs(u int, st []bool, g [][]int) int {
res := 0
st[u] = true
sum := 1
for _, x := range g[u] {
if !st[x] {
s := dfs(x, st, g)
res = max_i(res, s)
sum += s
}
}
res = max_i(res, len(g)-1-sum) // n-sum
ans = min_i(res, ans)
return sum
}
func max_i(a, b int) int {
if a < b {
return b
}
return a
}
func min_i(a, b int) int {
if a < b {
return a
}
return b
}
func main() {
_debug()
}
树与图的广度优先遍历
AcWing 847. 图中点的层次
package main
import (
"bufio"
"fmt"
"os"
)
func _debug() {
n, m := ri(), ri()
mp := map[int][]int{}
vis := make([]bool, n+1)
for ; m > 0; m-- {
a, b := ri(), ri()
mp[a] = append(mp[a], b)
}
q := []int{}
q = append(q, 1)
vis[1] = true
dist := 0
for len(q) != 0 {
size := len(q)
for i := 0; i < size; i++ {
cur := q[0]
q = q[1:]
vis[cur] = true
if cur == n {
fmt.Fprintln(out, dist)
return
}
for _, x := range mp[cur] {
if vis[x] {
continue
}
q = append(q, x)
}
}
dist++
}
fmt.Fprintln(out, -1)
}
// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0
var (
_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB rc rs rsn
outs = make([]byte, 0, 1e6*22) // 或者创建一个全局 array _o,然后 outS := _o[:0](效率几乎一样)
tmps = [64]byte{} // 可根据绝对值的十进制长度的上限调整
)
func rc() byte { // faster read one byte
if _i == _n {
_n, _ = os.Stdin.Read(buf)
if _n == 0 { // EOF
return eof
}
_i = 0
}
b := buf[_i]
_i++
return b
}
func ri() (x int) { // faster read int, support negative
neg := false
b := rc()
for ; '0' > b || b > '9'; b = rc() {
// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
if b == eof {
return
}
if b == '-' {
neg = true
}
}
for ; '0' <= b && b <= '9'; b = rc() {
x = x*10 + int(b&15)
}
if neg {
return -x
}
return
}
var (
in *bufio.Reader // 搭配Fscan使用
out *bufio.Writer
)
func main() {
in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
out = bufio.NewWriter(os.Stdout)
defer out.Flush()
// ===== ===== fast io ===== =====
_debug()
}
拓扑排序
AcWing 848. 有向图的拓扑序列