提出 #72328502


ソースコード 拡げる

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Random;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static final boolean TEST = false;
    public static final boolean DEBUG = false;
    static final String baseDir = "C:\\tmp\\AHC059\\";
    static final String inDir = baseDir + "in\\";
    static final String outDir = baseDir + "out\\";
    static final String infoDir = baseDir + "info\\";
    long startTime = System.currentTimeMillis();
    Random RND = new Random();
    long TIMER = 1700;

    Scanner in;
    PrintStream out;

    public static void main(String[] args) throws Exception {
        if (TEST) {
            try {
                {
                    FileWriter writer = new FileWriter(infoDir + "result.txt");
                    BufferedWriter bufferedWriter = new BufferedWriter(writer);
                    bufferedWriter.write("\n");
                    writer.close();
                }
                {
                    FileWriter writer = new FileWriter(infoDir + "data.txt");
                    BufferedWriter bufferedWriter = new BufferedWriter(writer);
                    bufferedWriter.write("\n");
                    bufferedWriter.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            File[] files = new File(inDir).listFiles();
            for (File f : files) {
                if (f.isFile()) {

                	//if ( !f.getName().equals("0282.txt") ) continue;

                	Main main = new Main(
                            new Scanner(f),
                            new PrintStream(outDir + f.getName())
                    );
                    main.fileName = f.getName();
                    main.init0();
                    main.fire();
                    main.out();
                    main.terminate();
                }
            }
        } else {
            Main main = new Main(new Scanner(System.in), System.out);
            main.init0();
            main.fire();
            main.out();
            main.terminate();
        }
    }

    public Main(Scanner in, PrintStream out) {
        this.in = in;
        this.out = out;
    }

    String fileName = null;

    static int N;
    int[][] A0,A;
    Stack<Integer> yama;
    int x,y;
    int turn=0;
    
    Pos[][] cardPos;
    
    final int[] vx = {0,-1,1,0,0};
    final int[] vy = {1,0,0,-1,0};
    
    long score, bestScore = Long.MAX_VALUE;
    char[] answer,bestAnswer;

    void init0() {
        N = in.nextInt();
        A = new int[N][N];
        A0 = new int[N][N];

        for (int y=0;y<N;y++) {
        	for (int x=0;x<N;x++) {
        		A0[y][x] = in.nextInt();
        	}
        }
        
        Pos.init(N);

        cardPos = new Pos[N*N/2][2];
        for (int y=0;y<N;y++) {
        	for (int x=0;x<N;x++) {
        		int n = A0[y][x];
        		if ( cardPos[n][0]==null )  cardPos[n][0] = Pos.get(x,y);
        		else cardPos[n][1] = Pos.get(x,y);
        	}
        }
                
        startTime = System.currentTimeMillis();
    }

    void init1() {
    	score = 0;
        for (int y=0;y<N;y++) {
        	for (int x=0;x<N;x++) {
        		A[y][x] = A0[y][x];
        	}
        }
        yama = new Stack<>();

        answer = new char[2*N*N*N];
        turn = 0;
        x=0;y=0;
    }

    void updateScore() {
    	if ( score < bestScore ) {
    		bestScore = score;
    		bestAnswer = answer;
    	}
    }
    
    void fire() {
    	init1();
    	f3();
    	updateScore();
}
    

    void f1() {
    	for (int t=0;t<N*N/2;t++) {
//    		System.err.println("T="+t +"  pos="+x+","+y);

//    		show(A);

            //一番近いカードに移動 & GET
    		Pos target = findNearestCard(x,y);
    		move(target);
    		getCard();

//    		System.err.println("T="+t +"  move to="+x+","+y);
//    		show(yama);
    		
    		//対応するカードに移動 & PUT
    		target = findPair(yama.peek());
    		move(target);
    		getCard();
    		
//    		System.err.println("T="+t +"  move to="+x+","+y);
//    		show(yama);
//    		System.err.println(answer);
    	}
    }
    
    void f2() {
    	int t=0;
    	while (t < N*N/2 ) {
    		//山が空→一番近いカードに移動 & GET
    		if ( yama.empty() ) {
        		Pos target = findNearestCard(x,y);
        		move(target);
        		getCard();
    		}
    		
    		//現在地とGOALの間に、ペアがあるか?
			Pos via=null;
			while ( ( via=findPair(x,y,findPair(yama.peek())) ) != null ) {
	    		//ペアがあれば、移動&GET
        		move(via);
        		getCard();
			}

			//山のてっぺんに対応するカードに移動 & PUT
    		Pos target = findPair(yama.peek());
    		move(target);
    		getCard();
    		t++;
    	}
    }
    
    void f3() {
    	int t=0;
    	while (t < N*N/2 ) {
    		//山が空→一番近いカードに移動 & GET
    		if ( yama.empty() ) {
        		Pos target = null;
        		
        		int bestMH=0;
        		for (int d=0;d<5;d++) {
        			int xx = x + vx[d];
        			int yy = y + vy[d];
        			if ( inside(xx, yy) && A[yy][xx]>=0 ) { //
        				int n = A[yy][xx];
        				int wkMH = cardPos[n][0].MH(cardPos[n][1]); //ペアまでの距離
        				if ( wkMH > bestMH ) {
        					target = Pos.get(xx, yy); //遠くに行こう
        					bestMH = wkMH;
        				}
        			}
        		}
        		
        		if ( target==null )target = findNearestCard(x,y);
    			
    			//近くのカードをランダムに選ぶ
        		move(target);
        		getCard();
    		}
    		
    		//現在地とGOALの間に、ペアがあるか?
			Pos via=null;
			while ( ( via=findPair(x,y,findPair(yama.peek())) ) != null ) {
	    		//ペアがあれば、移動&GET
        		move(via);
        		getCard();
			}

			//山のてっぺんに対応するカードに移動 & PUT
    		Pos target = findPair(yama.peek());
    		move(target);
    		getCard();
    		t++;
    	}
    }
    
    void move(Pos target) {
		while ( x != target.x ) {
			if ( x<target.x ) R();
			if ( x>target.x ) L();
		}
		while ( y != target.y ) {
			if ( y<target.y ) D();
			if ( y>target.y ) U();
		}
    }
    
    void R() {
    	answer[turn++] = 'R';
    	score++;
    	x++;
    }
    void L() {
    	answer[turn++] = 'L';
    	x--;
    }
    void U() {
    	answer[turn++] = 'U';
    	y--;
    }
    void D() {
    	answer[turn++] = 'D';
    	y++;
    }
    void getCard() {
    	answer[turn++] = 'Z';
    	if ( A[y][x]<0 ) System.err.println("No card at " + x + "," + y );
    	int wk = A[y][x];
    	A[y][x]=-1;
    	
    	if ( !yama.empty() && yama.peek() == wk ) {
    		yama.pop();
    		score++;
    	} else {
    		yama.push(wk);
    	}
    }
    void putCard() {
    	answer[turn++] = 'X';
    	if ( A[y][x]>=0 ) System.err.println("Already card at " + x + "," + y );
    	A[y][x] = yama.pop();
    }
    
    
    //一番近いカードを探す
    Pos findNearestCard(int x,int y) {
    	boolean[][] mark = new boolean[N][N];
    	Pos[] posList = new Pos[N*N*2];
    	int idx=0,length=0;
    	
    	posList[length++] = Pos.get(x, y);
    	while (idx<length) {
    		Pos crt = posList[idx++];
    	
    		for (int d=0;d<4;d++) {
    			int xx = crt.x + vx[d];
    			int yy = crt.y + vy[d];
    			if ( inside(xx,yy) && mark[yy][xx]==false ) {
    				if ( A[yy][xx]>=0 ) return Pos.get(xx, yy);
    				
    				mark[yy][xx]=true;
    				posList[length++] = Pos.get(xx, yy);
    			}
    		}
    	}
    	return null;
    }

    Pos findPair(int x0,int y0,Pos goal) {
    	int x1 = goal.x;
    	int y1 = goal.y;
    	
    	Pos ret = null;
    	int bestMH = goal.MH(x0,y0);    	
    	
    	for (int n=0;n<N*N/2;n++) {
    		int xx0 = cardPos[n][0].x; 
    		int yy0 = cardPos[n][0].y; 
    		int xx1 = cardPos[n][1].x; 
    		int yy1 = cardPos[n][1].y;
    		
    		if  ( A[yy0][xx0]>=0 && A[yy1][xx1]>=0 &&
    				xx0 >= x0 && xx0 <= x1 &&
    				xx1 >= x0 && xx1 <= x1 &&
    				yy0 >= y0 && yy0 <= y1 &&
    				yy1 >= y0 && yy1 <= y1 ) {
    			//近いほうを返す
    			int mh1 = cardPos[n][0].MH(x,y);
    			int mh2 = cardPos[n][1].MH(x,y);
    			
    			Pos wkTarget =  mh1<mh2 ? cardPos[n][0]:cardPos[n][1];
    			int wkMH = wkTarget.MH(x0,y0);
    			if ( wkMH < bestMH ) {
    				bestMH = wkMH;
    				ret = wkTarget;
    			}
    		}
    	}
    	return ret;
    }
    
    
    boolean inside(int x,int y) {
    	return x>=0 && y>=0 && x<N && y<N;
    }

    Pos findPair(int n) {
    	for (int y=0;y<N;y++) {
    		for (int x=0;x<N;x++) {
    			if ( A[y][x]==n ) return Pos.get(x,y);
    		}
    	}
    	return null;
    }
    
    
    //デバッグ出力
    void show(Object[] O) {
    	for (Object o : O ) System.err.println(o.toString());
    }
    void show(int[] z) {
		for (int x : z ) System.err.print(x +" " );
		System.err.println(".");
    }
    void show(int[][] Z) {
    	for (int[] z : Z ) show(z);
    }
    void show(Stack st) {
    	for (int i=0;i<st.size();i++) {
    		System.err.print( st.elementAt(i) +" " );
    	}
		System.err.println(".");
    }
    
    
    void out() {
    	int idx=0;
    	while ( bestAnswer[idx]!='\0' ) {
    		out.println(bestAnswer[idx++]);
    	}
        out.flush();
    }

    void terminate() {
        in.close();
        out.flush();
        out.close();

        System.err.println( bestScore );
        
        if (TEST) {
            try {
                FileWriter writer = new FileWriter(infoDir + "result.txt", true);
                writer.flush();
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

class Pos {
	static Pos[][] P;
	
	static void init(int N) {
		P = new Pos[N][N];
		for (int y=0;y<N;y++) {
			for (int x=0;x<N;x++) {
				P[y][x] = new Pos(x,y);
			}
		}
	}
	
	static Pos get(int x,int y) {
		return P[y][x];
	}
	
	int x,y;
	
	public Pos(int x,int y) {
		this.x=x;
		this.y=y;
	}
	
	int MH(int xx,int yy) {
		return Math.abs(x-xx)+Math.abs(y-yy);
	}
	int MH(Pos p) {
		return Math.abs(x-p.x)+Math.abs(y-p.y);
	}
	
	public String toString() {
		return x +","+ y;
	}
}

提出情報

提出日時
問題 A - Stack to Match Pairs
ユーザ yellowsubmarine
言語 Java24 (OpenJDK 24.0.2)
得点 2063674
コード長 10752 Byte
結果 AC
実行時間 144 ms
メモリ 43972 KiB

ジャッジ結果

セット名 test_ALL
得点 / 配点 2063674 / 2460000
結果
AC × 150
セット名 テストケース
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
ケース名 結果 実行時間 メモリ
test_0000.txt AC 126 ms 42268 KiB
test_0001.txt AC 134 ms 42304 KiB
test_0002.txt AC 124 ms 42396 KiB
test_0003.txt AC 123 ms 42312 KiB
test_0004.txt AC 132 ms 42176 KiB
test_0005.txt AC 123 ms 42452 KiB
test_0006.txt AC 123 ms 42544 KiB
test_0007.txt AC 123 ms 42672 KiB
test_0008.txt AC 120 ms 42404 KiB
test_0009.txt AC 118 ms 42004 KiB
test_0010.txt AC 122 ms 42540 KiB
test_0011.txt AC 126 ms 42164 KiB
test_0012.txt AC 120 ms 42644 KiB
test_0013.txt AC 138 ms 43828 KiB
test_0014.txt AC 122 ms 42268 KiB
test_0015.txt AC 123 ms 42496 KiB
test_0016.txt AC 120 ms 42388 KiB
test_0017.txt AC 138 ms 42632 KiB
test_0018.txt AC 119 ms 42836 KiB
test_0019.txt AC 124 ms 42884 KiB
test_0020.txt AC 119 ms 42480 KiB
test_0021.txt AC 120 ms 42560 KiB
test_0022.txt AC 132 ms 42384 KiB
test_0023.txt AC 121 ms 42268 KiB
test_0024.txt AC 121 ms 42804 KiB
test_0025.txt AC 124 ms 42512 KiB
test_0026.txt AC 121 ms 42792 KiB
test_0027.txt AC 134 ms 42636 KiB
test_0028.txt AC 121 ms 42416 KiB
test_0029.txt AC 123 ms 42280 KiB
test_0030.txt AC 118 ms 42932 KiB
test_0031.txt AC 116 ms 42268 KiB
test_0032.txt AC 122 ms 42448 KiB
test_0033.txt AC 123 ms 42448 KiB
test_0034.txt AC 121 ms 42380 KiB
test_0035.txt AC 121 ms 42568 KiB
test_0036.txt AC 122 ms 42956 KiB
test_0037.txt AC 136 ms 43020 KiB
test_0038.txt AC 123 ms 42700 KiB
test_0039.txt AC 120 ms 42548 KiB
test_0040.txt AC 122 ms 42568 KiB
test_0041.txt AC 123 ms 42796 KiB
test_0042.txt AC 132 ms 42708 KiB
test_0043.txt AC 122 ms 42536 KiB
test_0044.txt AC 135 ms 42276 KiB
test_0045.txt AC 136 ms 42844 KiB
test_0046.txt AC 122 ms 42340 KiB
test_0047.txt AC 121 ms 42428 KiB
test_0048.txt AC 122 ms 42524 KiB
test_0049.txt AC 122 ms 42364 KiB
test_0050.txt AC 137 ms 42788 KiB
test_0051.txt AC 132 ms 43184 KiB
test_0052.txt AC 134 ms 42548 KiB
test_0053.txt AC 121 ms 42576 KiB
test_0054.txt AC 119 ms 42420 KiB
test_0055.txt AC 132 ms 42692 KiB
test_0056.txt AC 120 ms 42580 KiB
test_0057.txt AC 120 ms 42796 KiB
test_0058.txt AC 137 ms 42916 KiB
test_0059.txt AC 123 ms 42340 KiB
test_0060.txt AC 119 ms 42148 KiB
test_0061.txt AC 130 ms 42512 KiB
test_0062.txt AC 120 ms 42504 KiB
test_0063.txt AC 140 ms 43688 KiB
test_0064.txt AC 124 ms 42572 KiB
test_0065.txt AC 123 ms 42816 KiB
test_0066.txt AC 135 ms 42572 KiB
test_0067.txt AC 124 ms 42716 KiB
test_0068.txt AC 135 ms 42456 KiB
test_0069.txt AC 131 ms 43492 KiB
test_0070.txt AC 121 ms 42552 KiB
test_0071.txt AC 124 ms 42364 KiB
test_0072.txt AC 132 ms 42868 KiB
test_0073.txt AC 122 ms 42736 KiB
test_0074.txt AC 132 ms 42372 KiB
test_0075.txt AC 131 ms 42456 KiB
test_0076.txt AC 136 ms 42224 KiB
test_0077.txt AC 124 ms 42268 KiB
test_0078.txt AC 130 ms 42316 KiB
test_0079.txt AC 137 ms 42416 KiB
test_0080.txt AC 123 ms 42340 KiB
test_0081.txt AC 123 ms 42236 KiB
test_0082.txt AC 137 ms 42664 KiB
test_0083.txt AC 123 ms 42548 KiB
test_0084.txt AC 144 ms 43972 KiB
test_0085.txt AC 123 ms 42500 KiB
test_0086.txt AC 118 ms 42660 KiB
test_0087.txt AC 118 ms 42368 KiB
test_0088.txt AC 124 ms 42564 KiB
test_0089.txt AC 134 ms 42364 KiB
test_0090.txt AC 124 ms 42408 KiB
test_0091.txt AC 121 ms 42424 KiB
test_0092.txt AC 122 ms 42528 KiB
test_0093.txt AC 127 ms 42172 KiB
test_0094.txt AC 133 ms 42532 KiB
test_0095.txt AC 134 ms 42452 KiB
test_0096.txt AC 122 ms 42164 KiB
test_0097.txt AC 134 ms 43784 KiB
test_0098.txt AC 137 ms 43316 KiB
test_0099.txt AC 121 ms 42392 KiB
test_0100.txt AC 125 ms 42388 KiB
test_0101.txt AC 121 ms 42924 KiB
test_0102.txt AC 122 ms 42576 KiB
test_0103.txt AC 135 ms 42420 KiB
test_0104.txt AC 142 ms 43628 KiB
test_0105.txt AC 142 ms 43824 KiB
test_0106.txt AC 134 ms 42432 KiB
test_0107.txt AC 133 ms 42744 KiB
test_0108.txt AC 133 ms 42460 KiB
test_0109.txt AC 128 ms 42512 KiB
test_0110.txt AC 120 ms 42468 KiB
test_0111.txt AC 134 ms 42496 KiB
test_0112.txt AC 123 ms 42252 KiB
test_0113.txt AC 125 ms 42700 KiB
test_0114.txt AC 122 ms 42556 KiB
test_0115.txt AC 122 ms 42332 KiB
test_0116.txt AC 120 ms 42668 KiB
test_0117.txt AC 120 ms 42612 KiB
test_0118.txt AC 124 ms 42372 KiB
test_0119.txt AC 119 ms 42352 KiB
test_0120.txt AC 123 ms 42636 KiB
test_0121.txt AC 119 ms 42668 KiB
test_0122.txt AC 124 ms 42680 KiB
test_0123.txt AC 122 ms 42348 KiB
test_0124.txt AC 124 ms 42508 KiB
test_0125.txt AC 127 ms 42324 KiB
test_0126.txt AC 124 ms 42376 KiB
test_0127.txt AC 122 ms 42340 KiB
test_0128.txt AC 120 ms 42564 KiB
test_0129.txt AC 135 ms 42688 KiB
test_0130.txt AC 127 ms 43672 KiB
test_0131.txt AC 138 ms 42656 KiB
test_0132.txt AC 122 ms 42516 KiB
test_0133.txt AC 120 ms 42680 KiB
test_0134.txt AC 119 ms 42448 KiB
test_0135.txt AC 125 ms 42320 KiB
test_0136.txt AC 121 ms 42284 KiB
test_0137.txt AC 124 ms 42628 KiB
test_0138.txt AC 121 ms 42828 KiB
test_0139.txt AC 128 ms 43316 KiB
test_0140.txt AC 134 ms 43572 KiB
test_0141.txt AC 123 ms 42300 KiB
test_0142.txt AC 120 ms 42280 KiB
test_0143.txt AC 124 ms 42416 KiB
test_0144.txt AC 121 ms 42564 KiB
test_0145.txt AC 116 ms 42388 KiB
test_0146.txt AC 136 ms 42508 KiB
test_0147.txt AC 124 ms 42572 KiB
test_0148.txt AC 135 ms 42764 KiB
test_0149.txt AC 122 ms 42352 KiB