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);
}
}
}
浙公网安备 33010602011771号