算法- 递归
1. Fractal Streets(分形)
-
题目链接
-
题目思路:
- 输入\(\to\) 城市的级数N,和序号。
- 输出\(\to\)所在位置,计算两点之间的距离
- 递归\(\to\)由大位置向小位置\(\to\)由小位置返回每次上级城市到下一级城市的位置变换
- 涉及难点\(\to\)坐标变换、
数据范围、边长需扩大10倍
-
题目代码:
import java.io.*;
import java.util.*;
public class Main {
static class InputReader {
BufferedReader reader;
StringTokenizer tokenizer;
public InputReader(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = null;
}
public boolean hasNext(){
while(tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
return false;
}
}
return true;
}
public String next() {
if(hasNext()) return tokenizer.nextToken();
return null;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {return Long.parseLong(next());}
}
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
Task task = new Task();
task.solve(in, out);
out.flush();
}
static class Task {
public void solve(InputReader in, PrintWriter out) {
int t = in.nextInt();
for(int k = 0; k < t; k ++) {
int n = in.nextInt();
long a = in.nextLong();
long b = in.nextLong();
Pos pA = dfs(n, a - 1);
Pos pB = dfs(n, b - 1);
long res = Math.round(Math.sqrt(Math.pow((pA.x*10 - pB.x*10), 2) + Math.pow((pA.y*10 - pB.y*10), 2)));
out.println(res);
}
}
public Pos dfs(int n, long num) {
if(n == 0) {
return new Pos(0, 0);
}
long len = 1L << (n - 1), cnt = 1L << (2 * n - 2);
Pos p = dfs(n - 1, num % cnt);
long x = p.x, y = p.y;
long z = num / cnt;
if( z == 0) return new Pos(y, x);
else if(z == 1) return new Pos(x, y + len);
else if(z == 2) return new Pos(x + len, y + len);
return new Pos(2 * len - 1 - y, len - 1 - x);
}
}
static class Pos {
long x;
long y;
public Pos(long x, long y) {
this.x = x;
this.y = y;
}
}
}
2. Fractal(分形)
-
题目链接
-
题目思路
- 输入\(\to\)盒数量
N,输出\(\to\)形状 - 算法\(\to\)由大位置向小位置递归,每次由小位置开始绘制,并向上返回绘制
- 难点\(\to\)位置变化、长度变化、考虑
数组的可记忆性
- 输入\(\to\)盒数量
-
题目代码
import java.io.*;
import java.util.*;
public class Main {
static class InputReader {
BufferedReader reader;
StringTokenizer tokenizer;
public InputReader(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = null;
}
public boolean hasNext(){
while(tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
return false;
}
}
return true;
}
public String next() {
if(hasNext()) return tokenizer.nextToken();
return null;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {return Long.parseLong(next());}
}
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
Task task = new Task();
task.solve(in, out);
out.flush();
}
static class Task {
int N = 3000;
int[][] p = new int[N + 1][N + 1];
public void solve(InputReader in, PrintWriter out) {
dfs(7, 1,1);
while(in.hasNext()){
int n = in.nextInt();
if(n == -1) {
break;
}
int len = (int)Math.pow(3, n - 1);
for(int i = 1; i <= len; i ++) {
for(int j = 1; j <= len;j ++) {
if(p[i][j] != 0) {
out.print("X");
}else {
out.print(' ');
}
}
out.println();
}
out.println('-');
}
}
public void dfs(int n, int x, int y) {
if(n == 1) {
p[x][y] = 'X';
return;
}
int len = (int)Math.pow(3, n - 2);
dfs(n - 1, x, y);
dfs(n - 1, x, y + 2 * len);
dfs(n - 1, x + 1 * len, y + 1 * len);
dfs(n - 1, x + 2 * len, y);
dfs(n - 1, x + 2 * len, y + 2 * len);
return;
}
}
}
3. Help C5(分形)
-
题目链接:
-
题目思路:
- 输入\(\to\)层数,输出\(\to\)图形
- 算法\(\to\)从大位置(相对于起始点)到小位置,从小位置返回图形
- 难点\(\to\)打印输出的格式,每行
不能有多余空格;由于数组的记忆性,每次计算下一层时,需要重置被记忆的数组;最后一行需要有回车
-
代码
import java.io.*;
import java.util.*;
public class Main {
static class InputReader {
BufferedReader reader;
StringTokenizer tokenizer;
public InputReader(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = null;
}
public boolean hasNext(){
while(tokenizer == null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(reader.readLine());
} catch (IOException e) {
return false;
}
}
return true;
}
public String next() {
if(hasNext()) return tokenizer.nextToken();
return null;
}
public int nextInt() {
return Integer.parseInt(next());
}
public long nextLong() {return Long.parseLong(next());}
}
public static void main(String[] args) {
InputReader in = new InputReader(System.in);
PrintWriter out = new PrintWriter(System.out);
Task task = new Task();
task.solve(in, out);
out.flush();
}
static class Task {
int N = 3000;
int[][] p = new int[N + 1][N + 1];
public void solve(InputReader in, PrintWriter out) {
int t = in.nextInt();
for(int m = 0; m < t; m ++) {
int k = in.nextInt();
int len = (int)Math.pow(3, k);
for(int i = 0; i < len; i ++) {
for(int j = 0; j < len; j ++) {
p[i][j] = 0;
}
}
dfs(k, 1, 1);
for(int i = 1 ; i<= len; i ++) {
int end = 0;
for(int j = len; j >= 1; j --) {
if(p[i][j] != 0) {
end = j;
break;
}
}
for(int j = 1; j <= end; j ++) {
if(p[i][j]!= 0){
out.print('C');
}else {
out.print(' ');
}
}
out.println();
}
}
}
public void dfs(int n, int x, int y) {
if(n == 0) {
p[x ][y] = 'C';
return;
}
int len = (int)Math.pow(3, n - 1);
dfs(n - 1, x, y + 1 * len);
dfs(n - 1, x, y + 2 * len);
dfs(n - 1, x + 1 * len, y);
dfs(n - 1, x + 2 * len, y + 1 * len);
dfs(n - 1, x + 2 * len, y + 2 * len);
return;
}
}
}

浙公网安备 33010602011771号