蓝桥杯2022年第十三届决赛真题

您所在的位置:网站首页 蓝桥杯offer 蓝桥杯2022年第十三届决赛真题

蓝桥杯2022年第十三届决赛真题

#蓝桥杯2022年第十三届决赛真题| 来源: 网络整理| 查看: 265

解题思路:

整体思路就是去除中间繁琐的变换状态,记录最终窗口优先级并绘制。

详细看注释就行了

注意事项:

参考代码:

import java.io.*;import java.util.Arrays;import java.util.LinkedList;import java.util.Queue;

public class _2022_4窗口 {    static int inf = 0x3f3f3f3f;    static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));    static StreamTokenizer st = new StreamTokenizer(bf);    static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));

   public static class window{        int top;        int l;        int h;        int w;        //最终窗口优先级        int pior;

       public window(int top, int l, int h, int w, int pior) {            this.top = top;            this.l = l;            this.h = h;            this.w = w;            this.pior = pior;        }    }    static int n;    static int m;    static int k;    //索引当作窗口PID来记录窗口改变窗口    static window [] arr = new window[100000 + 5];    //结果图    static char ans[][];    //根据优先级从小到大排列后的窗口顺序.    static window [] aarr;

   public static void main(String[] args) throws IOException {        String [] tmp1 = bf.readLine().split(" ");        n = Integer.parseInt(tmp1[0]);        m = Integer.parseInt(tmp1[1]);        k = Integer.parseInt(bf.readLine());        ans = new char[n][m];        for (int i = 0; i < n; i++){            Arrays.fill(ans[i], '.');        }        //用于存储窗口PID之后不至于完全遍历arr数组        Queue q = new LinkedList();        int li = 0;        int lj = 0;        int ri = 0;        int rj = 0;        //用于记录窗口个数方便设置aarr数组大小        int num = 0;        //用于设置窗口优先级大小,确保靠后操作的窗口优先级最大        int mpt = 1;        for (int i = 0; i < k; i++){            String s  = bf.readLine();            String [] tmp = s.split(" ");            if (!q.contains(Integer.parseInt(tmp[1]))) {                q.offer(Integer.parseInt(tmp[1]));            }            switch (tmp[0]){                case "new":                    num++;                    arr[Integer.parseInt(tmp[1])] = new window(Integer.parseInt(tmp[2]),Integer.parseInt(tmp[3]),Integer.parseInt(tmp[4]),Integer.parseInt(tmp[5]), ++mpt);                    break;                case "move" :                    arr[Integer.parseInt(tmp[1])].top += Integer.parseInt(tmp[2]);                    arr[Integer.parseInt(tmp[1])].l += Integer.parseInt(tmp[3]);                    arr[Integer.parseInt(tmp[1])].pior = ++mpt;                    break;                case "resize" :                    arr[Integer.parseInt(tmp[1])].h = Integer.parseInt(tmp[2]);                    arr[Integer.parseInt(tmp[1])].w = Integer.parseInt(tmp[3]);                    arr[Integer.parseInt(tmp[1])].pior = ++mpt;                    break;                case "close" :                    arr[Integer.parseInt(tmp[1])].pior = 0;                    break;                case "active":                    arr[Integer.parseInt(tmp[1])].pior = ++mpt;                    break;            }

       }        bf.close();        aarr = new window[num];        //记录完所有数据后PID就没有用了,只考虑优先级就行了        int tmp = 0;        while(!q.isEmpty()){            aarr[tmp] = arr[q.poll()];            tmp++;        }

       //因为条件说存在的窗口不超过200所以为了保证稳定性采用冒泡排序        for (int end = num - 1; end > 0; end--){            for (int begin = 0; begin <  end; begin++){                if (aarr[begin].pior > aarr[begin + 1].pior){                    window temp = aarr[begin];                    aarr[begin] = aarr[begin + 1];                    aarr[begin + 1] = temp;                }            }        }

       //绘制窗口        for(int i = 0; i < num; i++){            if (aarr[i].pior != 0){                li = aarr[i].top;                lj = aarr[i].l;                ri = li + aarr[i].h - 1;                rj = lj + aarr[i].w - 1;                drow(li, lj, ri, rj);            }        }        //用来测试答案的//        BufferedWriter out = new BufferedWriter(new FileWriter("11.txt"));

//        for (int i= 0; i< n; i++){//            for (int j = 0; j < m ;j++){//                out.write(ans[i][j]);//            }//            out.write("\r\n");////        }//        out.flush();                for (int i= 0; i< n; i++){            for (int j = 0; j < m ;j++){                System.out.print(ans[i][j]);            }            System.out.println();        }    }        public static void drow(int li, int lj, int ri, int rj){//        确保能够绘制        if (ri < li ){            li ^= ri;            ri ^= li;            li ^= ri;        }        if (rj < lj){            rj ^= lj;            lj ^= rj;            rj ^= lj;        }                for (int i = li; i = 0){                    if (i == li){                        if (j == lj || j == rj){                            ans[i][j] = '+';                        }else{                            ans[i][j] = '-';                        }                    }else if(i == ri){                        if (j == lj || j == rj){                            ans[i][j] = '+';                        }else {                            ans[i][j] = '-';                        }                    }else if(j == lj || j == rj){                        ans[i][j] = '|';                    }else {                        ans[i][j] = ' ';                    }                }            }        }    }}

 

0.0分

1 人评分

分享 收藏


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3