提出 #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 | ||
| 結果 |
|
| セット名 | テストケース |
|---|---|
| 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 |