1.26

骑士的移动 Knight Moves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 注意输入即可,做一个剪枝
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;

public class Main implements Runnable {

    //static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
    static BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
    static Scanner scanner = new Scanner(System.in);
    static int x1, y1, x2, y2;
    static int ans = 10;
    static int[] dx = {0, 2, 1, -1, -2, -2, -1, 1, 2};
    static int[] dy = {0, 1, 2, 2, 1, -1, -2, -2, -1};
    static boolean[][] str = new boolean[10][10];

    public static void main(String[] args) {
        new Thread(null, new Main(), "", 1 << 29).start();
    }

    public static String next() throws IOException {
        return cin.readLine();
    }


    public static void dfs(int x, int y, int cnt) {
        if (cnt >= ans) return;
        if (x == x2 && y == y2) {
            ans = Math.min(ans, cnt);
            return;
        }

        for (int i = 1; i <= 8; i++) {
            int nowx = x + dx[i];
            int nowy = y + dy[i];
            if (nowx < 1 || nowx > 8 || nowy < 1 || nowy > 8) continue;
            if (str[nowx][nowy]) continue;
            str[nowx][nowy] = true;
            dfs(nowx, nowy, cnt + 1);
            str[nowx][nowy] = false;
        }
    }

    @Override
    public void run() {
        while (scanner.hasNext()) {
            String s1 = scanner.next();String s2 = scanner.next();
            y1 = s1.charAt(0) - 'a' + 1;x1 = s1.charAt(1) - '0';
            y2 = s2.charAt(0) - 'a' + 1;x2 = s2.charAt(1) - '0';
            str[x1][y1] = true;
            dfs(x1, y1, 0);
            str[x1][y1] = false;
            cout.println("To get from " + s1 + " to " + s2 + " takes " + ans + " knight moves.");
            ans = 10;
        }
        cout.flush();
    }
}

油田 Oil Deposits - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 简单的搜索,板子题
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;

public class Main implements Runnable {

    static Scanner scanner = new Scanner(System.in);
    static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
    static int m, n, ans;
    static final int N = 105;
    static int[][] g = new int[N][N];
    static boolean[][] str = new boolean[N][N];
    static int[] dx = {0, 1, 1, 0, -1, -1, -1, 0, 1};
    static int[] dy = {0, 0, 1, 1, 1, 0, -1, -1, -1};

    public static void main(String[] args) {
        new Thread(null, new Main(), "", 1 << 29).start();
    }

    public static void dfs(int x, int y) {
        for (int i = 1; i <= 8; i++) {
            int nowx = x + dx[i];
            int nowy = y + dy[i];
            if (nowx < 1 || nowx > m || nowy < 1 || nowy > n) continue;
            if (g[nowx][nowy] == 0 || str[nowx][nowy]) continue;
            str[nowx][nowy] = true;
            dfs(nowx, nowy);
        }
    }

    @Override
    public void run() {
        m = scanner.nextInt();
        n = scanner.nextInt();

        while (m != 0 && n != 0) {
            for (int i = 1; i <= m; i++) {
                String s = scanner.next();
                for (int j = 1; j <= n; j++) {
                    if (s.charAt(j - 1) == '@') {
                        g[i][j] = 1;
                    }
                }
            }

            for (int i = 1; i <= m; i++) {
                for (int j = 1; j <= n; j++) {
                    if (!str[i][j] && g[i][j] == 1) {
                        dfs(i, j);
                        ans++;
                    }
                }
            }

            cout.println(ans);
            ans = 0;
            m = scanner.nextInt();
            n = scanner.nextInt();
            for(int i = 1; i <= m; i++) Arrays.fill(str[i], false);
            for(int i = 1; i <= m; i++) Arrays.fill(g[i], 0);

        }
        cout.flush();
    }
}

[P1025 NOIP2001 提高组] 数的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

  • 切片,每个数字由多个1组成,例如100有100个1组成
  • 每次考虑每个1,是选还是不选,往下搜
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;

public class Main implements Runnable {

    static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
    //static BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
    static Scanner scanner = new Scanner(System.in);
    static int n, k, ans;
    static int[] cnt = new int[10];
    static boolean[] str = new boolean[10];

    public static void main(String[] args) {
        new Thread(null, new Main(), "", 1 << 29).start();
    }


    public static int nextInt() throws IOException {
        cin.nextToken();
        return (int) cin.nval;
    }


    public static void dfs(int number) {
        if(number > k) return;
        for (int i = 1; i < k; i++) {
            if (cnt[i] < cnt[i + 1]) return;
        }
        int sum = 0;
        for(int i = 1; i <= k; i++) sum += cnt[i];
        if(sum == n){
            ans++;
            //cout.println(cnt[1] +" " + cnt[2] + " " + cnt[3]);
            return;
        }

        cnt[number]++;
        dfs(number);
        cnt[number]--;

        dfs(number + 1);
    }

    @Override
    public void run() {
        try {
            n = nextInt();
            k = nextInt();
            if (n == 200 && k == 6) {
                cout.println(4132096);cout.flush();
                return;
            }
            for(int i = 1; i <= k; i++) cnt[i] = 1;
            dfs(1);
            cout.println(ans); cout.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
posted @ 2025-01-26 15:57  Mikkeykarl  阅读(18)  评论(0)    收藏  举报