算法- 递归

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\)位置变化、长度变化、考虑数组的可记忆性
  • 题目代码

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;
        }
    }

}
posted @ 2020-03-09 11:05  tumint  阅读(52)  评论(0)    收藏  举报