【冬日绘板】5ab AK IOI
  • 板块灌水区
  • 楼主optimize_2
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/1/1 00:25
  • 上次更新2023/11/5 05:24:38
查看原帖
【冬日绘板】5ab AK IOI
224978
optimize_2楼主2021/1/1 00:25

有比较闲的同学帮忙吗

@不刷题的5ab orz

在冬日绘版界面按下F12,选中console选项卡

复制粘贴下面的代码 按回车 plzplz

(function(initConfig){
    'use strict';


    if(typeof initConfig==='undefined'){
        initConfig={};
    }

    Array.prototype.flat=Array.prototype.flat||function(){var arr = [];this.forEach((item,idx)=>{if(Array.isArray(item)){arr=arr.concat(item.flat())}else{arr.push(item)}});return arr}

    clearTimeout();
    clearInterval();

    var colorDivs=document.getElementsByClassName('paleitem');
    for(let i=0;i<32;i++){
        let d=colorDivs[i];
        d.title=Number(d.dataset.cid).toString(32);
    }

    const defaultBackGround = 2;

    var mine = Array(W);
    for (var i = 0; i < W; ++i) {
        mine[i] = Array(H);
        for (var j = 0; j < H; ++j) mine[i][j] = defaultBackGround;
    }

    function colorStyle(color){
        if(color===colorlist[1])return 'color:black';
        else return 'color:'+color;
    }

    const colornames = '黑 白 灰 深灰 亮粉 粉 亮橙 亮红 红 紫红 深粉 暗粉 紫 深蓝 蓝青 暗青 蓝 青 亮青 淡蓝 深绿 绿 黄绿 浅绿 暗白 淡橙 黄 浅橙 橙 橙红 红棕 棕'.split(' ');
    var colorname = {};
    var colorid = {};
    for (var i = 0; i < colornames.length; ++i) {
        colorname[i] = colornames[i] + '色';
        colorname[colorlist[i]] = colorname[i];
        colorid[colorlist[i]] = i;
    }

     $('#mycanvas').unbind("click");
	$('#mycanvas').bind("click",function() {
        var x = parseInt(event.offsetX / scale);
        var y = parseInt(event.offsetY / scale);
        console.info('定点: ('+x+','+y+'),颜色:%c'+colorname[colorlist[mine[x][y]]],colorStyle(colorlist[mine[x][y]]));
    });

    var calcTime=0,dx,dy;

    var lmap,lw,lh;
    var limitRate;
    function setLMap(map){
        lmap=map;
        if(!inited)return;
        lh=lmap.length;
        lw=Math.max(...lmap.map(str=>str.length));
        var count=-50;
        lmap.map(function(str){
            [...str].map(function(ch){
                if(ch===' '){
                    count++;
                }
            })
        });
        limitRate=1-count/(lw*lh);
        if(config.logLevel<=1)console.log(
            '已设置图形为\n'
            +lmap.map(arr=>([...arr].map(ch=>'%c'+ch+' ').join(''))).join('\n'),
            ...lmap.map(arr=>([...arr].map(ch=>`font-size:6px;background:`+colorlist[getColor(ch)]))).flat()
        );
        calcBest();
        return config;
    }

    function getColor(ch){
        if(ch==='@')return parseInt(config.foreColor,32);
        else if(ch===' ')return defaultBackGround;
        else return parseInt(ch,32);
    }

    var important=[];
    for (var i = 0; i < W; ++i) {
        important[i] = [];
        for (var j = 0; j < H; ++j)important[i][j]=false;
    }

    var pfs = [];
    for (var i = 0; i < W; ++i) pfs[i] = [];
    function calcBest() {

        var cPos=config.pos;

        if(cPos.x!==-1&&cPos.y!==-1&&config.lockPos){
            if(config.logLevel<=0)console.log('绘制区域锁定在('+cPos.x+','+cPos.y+')');
            dx=cPos.x;
            dy=cPos.y;
            return;
        }

        if(config.logLevel<=0)console.log('寻找最优绘制区域');
        calcTime=config.calcCooldown;

        if(lw<=0||lh<=0){
            cPos.x=cPos.y=dx=dy=-1;
            return;
        }

        let pt = [];
        for (var i = 0; i < lmap.length; ++i) for (var j = 0; j < lmap[i].length; ++j) {
            var c=getColor(lmap[i].charAt(j));
            if(c!==defaultBackGround)pt.push({
                dx: j,
                dy: i,
                color:c
            })
        }

        function pfv(x, y) {
            return x >= 0 && y >= 0 ? pfs[x][y] : 0
        }

        for (var i = 0; i < W; ++i) for (var j = 0; j < H; ++j) {
            pfs[i][j] = pfv(i, j - 1) + pfv(i - 1, j) - pfv(i - 1, j - 1) + (mine[i][j] !== defaultBackGround ? 1 : 0)
        }
        var gl = [];

        for (let i = 0; i < W - lw + 1; ++i){
            for (let j = 0; j < H - lh + 1; ++j) {
                let nowp = {
                    x: i,
                    y: j
                };
                nowp.d = pfs[i + lw - 1][j + lh - 1] - (pfv(i + lw - 1, j - 1) + pfv(i - 1, j + lh - 1) - pfv(i - 1, j - 1));
                if (nowp.d > lw * lh * limitRate&&!important[i][j]) continue;
                for (let k in pt) {
                    if(k=='flat')continue;
                    // if(isNaN(j+pt[k].dy)){
                    //  console.debug(i,j,pt,k,pt[k],nowp);
                    // }
                    var nowb = mine[i + pt[k].dx][j + pt[k].dy];
                    if (nowb === defaultBackGround)++nowp.d;
                    if (nowb === pt[k].color)--nowp.d
                }
                gl.push(nowp)
            }
        }

        function pcmp(a, b) {
            return a.d - b.d
        }

        gl.sort(pcmp);

        var fixed = 0;
        while (fixed<gl.length&&gl[fixed].d === 0)++fixed;
        if(fixed>=gl.length||fixed>=config.maxObject){
            cPos.x=cPos.y=dx=dy=-1;
            return;
        }

        function cross(a1, a2) {
            return (a1.x - lw + 1 <= a2.x && a2.x <= a1.x + lw - 1) && (a1.y - lh + 1 <= a2.y && a2.y <= a1.y + lh - 1)
        }

        function good(id) {
            for (var i = 0; i < fixed; ++i) if (cross(gl[i], gl[id])) return false;
            return true;
        }

        var nowgp = fixed;
        while (!good(nowgp)){
            if(++nowgp>=gl.length){
                cPos.x=cPos.y=dx=dy=-1;
                return;
            }
        }
        cPos.x = dx = gl[nowgp].x;
        cPos.y = dy = gl[nowgp].y;
        important[dx][dy]=true;
    }

    update=function(y, x, color) {//覆盖洛谷脚本同名函数
        if(mine[x][y] === colorid[color])return;
        mine[x][y] = colorid[color];
        if (config.logUpdate) console.log(`坐标(`+x+`,`+y+`)被更新为%c`+colorname[color],colorStyle(color));
        if (config.showUpdate) {
            var c = document.getElementById("mycanvas");
            var ctx = c.getContext("2d");
            ctx.save();
            ctx.fillStyle = color;
            ctx.fillRect(x * 5, y * 5, 5, 5)
        }
    }

    var freshTime=0;

    function freshPrintBoard(callback) {
        if (config.doRefreshing&&freshTime<=0) {
            try{
                 $.ajax({
					type:"GET",
					url:"/paintBoard/board",
					success(resp) {
						if(config.logLevel<=0)console.log('刷新界面完成');
						freshTime = config.refreshCooldown;
						resp.split('\n').map(function(colorStr, x) {
							colorStr.split("").map(function(color, y) {
								update(y, x, colorlist[parseInt(color, 32)])
							})
						});
						callback();
					},
					error(...resp){
						if(config.logLevel<=2)console.warn('刷新界面时出现错误,返回',resp);
						wait(function() {
							freshPrintBoard(callback)
						},config.errorDelay);
					}
				});
			}catch(e){
				return;
			}
		} else {
			freshTime--;
			setTimeout(callback);
		}
	}

	function make(dx, dy) {
		if(dx===-1&&dy===-1)return [];
		var el = [];
		for (var i = 0; i <= lmap.length - 1; ++i) for (var j = 0; j <= lmap[i].length - 1; ++j) el.push({
			x: j + dx,
			y: i + dy,
			color: getColor(lmap[i].charAt(j))
		});
		var l = el.length;
		var midx = 0;
		var midy = 0;
		for (var i = 0; i <l; ++i) {
			midx += el[i].x;
			midy += el[i].y
		}
		midx /= l;
		midy /= l;
		var mid = {
			x: midx,
			y: midy
		};
		function dis(a, b) {
			return Math.
			max(Math.abs(a.x - b.x) / lw, Math.abs(a.y - b.y) / lh)
		}

		function value(e){
			var res=0,fc=parseInt(config.foreColor,32);
			if(e.color==fc)res+=1000000;
			if(mine[e.x][e.y]==fc)res+=1000000;
			let [a,b]=config.ord==='col'?[1e4,100]:[100,1e4];
			if(e.color!==defaultBackGround)res-=e.x/W*a+e.y/H*b-1000000;
			else res-=dis(e,mid)*1;
			return res;
		}

		function cmp(ea, eb) {
			return value(eb)-value(ea);
		}
		el.sort(cmp);
		return el;
	}

	function wait(callback,delay=1000){
		const time=$('#timeleft').text();
        if(time==='冷却时间到'){
            if(config.logLevel<=0)console.log('冷却时间到');
            setTimeout(callback,delay);
        }else{
            var arr=time.split(':').map(Number);
            var sec=arr.reduce((pre,now)=>pre*60+now) + 1;
            if(config.logLevel<=0)console.log(`进入等待,剩余`+sec+`秒`);
            setTimeout(function(){
                wait(callback,delay);
            },sec*1000);
        }
    }

    function doit(x, y, c,callback) {
        var nowcolor = c;
        update(y, x, colorlist[nowcolor]);
         $.ajax({
			type:"POST",
			url:"/paintBoard/paint",
			data:{
				x,
				y,
				color: nowcolor
			},
			success(resp) {
				if(resp.status!==200){
					if(config.logLevel<=2)console.warn(`在(`+x+`,`+y+`)绘制%c`+colorname[colorlist[c]]+`时出现错误`,colorStyle(colorlist[c])+'时出现错误,返回',resp);
					wait(function(){
						doit(x,y,c,callback);
					},config.errorDelay);
				}else{
					if(config.logLevel<=1)console.log(`在(`+x+`,`+y+`)绘制了%c`+colorname[colorlist[c]],colorStyle(colorlist[c]));
					var lasttime = (new Date()) / 1000;
					getCountDown(lasttime + timelimit);
					$('#timeleft').html(`00:00:`+timelimit);
                    wait(callback,config.delay);
                    if(calcTime<=0){
                        calcBest();
                    }else{
                        calcTime--;
                    }
                }
            },
            error(...resp){
                if(config.logLevel<=2)console.warn(`在(`+x+`,`+y+`)绘制%c`+colorname[colorlist[c]],colorStyle(colorlist[c])+'时出现错误,返回',resp);
                wait(function(){
                    doit(x,y,c,callback);
                },config.errorDelay);
            }
        });
    }

    function process() {
        freshPrintBoard(function() {
            var el=make(dx, dy);
            for(var i=0;i<el.length;i++){
                var e = el[i];
                if(e.color !== mine[e.x][e.y]){
                    doit(e.x, e.y, e.color, process);
                    return; 
                }
            }
            if(config.logLevel<=1)console.log('未找到需绘制的点');
            wait(process,config.lazyDelay);
            calcBest();
            return;
        });
    }

    var inited=false;

    function setCfg(newCfg){
        for(var key in newCfg){
            config[key]=newCfg[key];
        }
        config.setCfg=setCfg;
        return config;
    }

    //默认配置
    var config={
        doRefreshing:true,
        refreshCooldown:0,
        logUpdate:false,
        showUpdate:true,
        calcCooldown:2,
        maxObject:1,
        delay:1000,
        errorDelay:5000,
        lazyDelay:30000,
        logLevel:0,
        foreColor:'g',
        lockPos:false,
        pos:{x:-666,y:-666},
        ord:'col',
         $lmap:[
             "  @@@@@    @@@    @@@@     @@@    @  @   ",
             "  @       @   @   @   @   @   @   @ @    ",
             "  @@@@@   @@@@@   @@@@    @@@@@   @@     ",
             "      @   @   @   @   @   @   @   @ @@   ",
             "  @@@@@   @   @   @@@@    @   @   @   @@ ",

             /*
			"                                                                       ",
			" rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr ",
			" riii111iiiiiiiiiiiiiiiiiiiii111iiiiiii111111iiiiiiiiiiiiii1iiiiiiii1r ",
			" ri@i111i@@@@@i@@@@@i@@@@@i@i111i@@@@@i111111i@i@ii@@@@@i@iii@ii@@@i1r ",
			" ri@i111iii@iiiii@iiiii@iii@i111i@iiiii11111ii@i@iiii@iii@@ii@i@iiiiir ",
			" ri@i11111i@i111i@i111i@i1i@i111i@@@@@i11111i@i@i@i1i@i1i@i@i@i@i@@@ir ",
			" ri@iiiiiii@iii1i@i111i@i1i@iiiii@iiiiiiiiiii@i@i@iii@iii@ii@@i@iii@ir ",
			" ri@@@@@i@@@@@i1i@i111i@i1i@@@@@i@@@@@i@@@@@i@i@i@i@@@@@i@iii@ii@@@iir ",
			" riiiiiiiiiiiii1iii111iii1iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii1iiiiiiii1r ",
			" rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr ",
			"                                                                       "
            */
		],
		set lmap(x){
			this.$lmap=x;
            setLMap(x);
        },
        get lmap(){
            return this.$lmap;
        }
    };

    setCfg(initConfig);

    freshPrintBoard(function(){
        inited=true;
        setLMap(config.lmap);
        setTimeout(function(){
            wait(process,config.delay);
        },config.delay);
    })

    console.clear();
    if(config.logLevel<=2)console.log('加载完成,准备执行……');

    return config;
}())
2021/1/1 00:25
加载中...