CSES 2427 - Letter Pair Move Game  解題心得( 題目 )

解題概念:觀察規律

解題方法:這題不像是演算法題目,雖然看起來很圖論,但我們可透過觀察規律,可以發現一致的解題流程,且最終次數不超過題目限制。

Java參考程式碼(有更好意見可留言於下方,謝謝!)

import java.io.*;

import java.util.*;

import java.math.*;

public class cses2427 {

    public static int ret,r;

    public static int n,n2,cnt,idx;

    public static char[][] ans=new char[1005][205];

    public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

    public static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));    

    public static void main(String[] args) throws Exception{

        n=Integer.parseInt(br.readLine())-1;

        n2=(n+1)<<1;

        String in=br.readLine();

        for(int i=0;i<n2;i++) {

            ans[0][i]=in.charAt(i);

        }


        if(n==1) { //only one pair

            boolean noAns=true;

            for(int i=0;i<n2;i++) {

                if(ans[0][i]=='A')noAns=false;

                if(ans[0][i]=='B')break;

            }


            bw.write(noAns?"-1":"0");

        }

        else {

            run();

        }

        bw.flush();

      }

    


    public static void run() throws Exception{

        idx=findEmpty();

        while(idx<n2-3) {

            move(idx+2,idx);

            idx+=2;

        }

        if(idx%2!=0)roll();

        int Acnt=0;

        steps:

        for(int i=0;Acnt<n&&i<n2;i++) {

            if(ans[cnt][i]=='B') {

                for(int j=i+2;j<n2-3;j++) {

                    if(ans[cnt][j]=='A') {

                        swap(i,j);

                        Acnt++;

                        continue steps;

                    }

                }

                move(i,n2-2);

                if(ans[cnt][n2-3]=='A'&&n>2) {

                    move(n2-3,i);

                }

                break steps;

            }

        }

        boolean noAns=false;

        Acnt=0;

        for(int i=0;Acnt<n;i++) {

            if(ans[cnt][i]=='A') {

                Acnt++;

            }

            if(ans[cnt][i]=='B') {

                noAns=true;

                break;

            }

        }

        if(noAns) {

            bw.write("-1");

        }

        else {

            bw.write(cnt+"\n");

            for(int i=1;i<=cnt;i++) {

                for(int j=0;j<n2;j++) {

                    bw.write(ans[i][j]);

                }

                bw.write("\n");

            }

        }

        return;

    }

    

    public static void roll() {

        move(n2-6,n2-3);

        move(n2-4,n2-6);

        move(n2-2,n2-4);

    }

    


    public static void swap(int a,int b) {

        move(a,n2-2);

        move(b,a);

        move(n2-2,b);

    }

    

    public static void move(int ip,int ie){

        cnt++;

        for(int i=0;i<n2;i++) {

            ans[cnt][i]=ans[cnt-1][i];

        }

        ans[cnt][ie]=ans[cnt-1][ip];

        ans[cnt][ie+1]=ans[cnt-1][ip+1];

        ans[cnt][ip]='.';

        ans[cnt][ip+1]='.';

    }


    

    public static int findEmpty() {

        for(int i=0;i<n2;i++) {

            if(ans[0][i]=='.')return i;

        }

        return 0;//never reach here

    }

}

 

 

 

文章標籤
全站熱搜
創作者介紹
創作者 En Chi Tsung 的頭像
En Chi Tsung

阿祁的部落格

En Chi Tsung 發表在 痞客邦 留言(0) 人氣(3)