← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	scanner.Scan()
	n, _ := strconv.Atoi(scanner.Text())

	type file struct {
		name string
		t    int
	}
	files := make([]file, n)
	nameSet := make(map[string]bool)
	cnt1 := 0

	for i := 0; i < n; i++ {
		scanner.Scan()
		name := scanner.Text()
		scanner.Scan()
		t, _ := strconv.Atoi(scanner.Text())
		files[i] = file{name, t}
		nameSet[name] = true
		if t == 1 {
			cnt1++
		}
	}

	tmp := "tmp"
	for nameSet[tmp] {
		tmp += "x"
	}

	isNum := func(s string) (int, bool) {
		if len(s) == 0 || len(s) > 6 {
			return 0, false
		}
		for i := 0; i < len(s); i++ {
			if s[i] < '0' || s[i] > '9' {
				return 0, false
			}
		}
		if s[0] == '0' && len(s) > 1 {
			return 0, false
		}
		num, err := strconv.Atoi(s)
		if err != nil || num < 1 || num > n {
			return 0, false
		}
		return num, true
	}

	bad1 := []string{}
	bad0 := []string{}
	g1 := []string{}
	g0 := []string{}

	for i := 1; i <= cnt1; i++ {
		s := strconv.Itoa(i)
		if !nameSet[s] {
			g1 = append(g1, s)
		}
	}
	for i := cnt1 + 1; i <= n; i++ {
		s := strconv.Itoa(i)
		if !nameSet[s] {
			g0 = append(g0, s)
		}
	}

	for _, f := range files {
		num, ok := isNum(f.name)
		if !ok {
			if f.t == 1 {
				bad1 = append(bad1, f.name)
			} else {
				bad0 = append(bad0, f.name)
			}
			continue
		}
		if f.t == 1 {
			if num > cnt1 {
				bad1 = append(bad1, f.name)
			}
		} else {
			if num <= cnt1 {
				bad0 = append(bad0, f.name)
			}
		}
	}

	var moves [][2]string

	for len(bad1) > 0 && len(bad0) > 0 {
		f1 := bad1[len(bad1)-1]
		bad1 = bad1[:len(bad1)-1]
		f0 := bad0[len(bad0)-1]
		bad0 = bad0[:len(bad0)-1]

		moves = append(moves, [2]string{f0, tmp})
		moves = append(moves, [2]string{f1, f0})
		moves = append(moves, [2]string{tmp, f1})
	}

	for _, f := range bad1 {
		slot := g1[len(g1)-1]
		g1 = g1[:len(g1)-1]
		moves = append(moves, [2]string{f, slot})
	}

	for _, f := range bad0 {
		slot := g0[len(g0)-1]
		g0 = g0[:len(g0)-1]
		moves = append(moves, [2]string{f, slot})
	}

	fmt.Println(len(moves))
	for _, m := range moves {
		fmt.Printf("move %s %s\n", m[0], m[1])
	}
}
```