2012藍橋杯c組--移動字母(dfs)

A B C
D   E

    爲了表示方便,我們把6個格子中字母配置用一個串表示出來,比如上邊的兩種局面分別表示爲:

AB*DEC
ABCD*E

    題目的要求是:請編寫程序,由用戶輸入若干表示局面的串,程序通過計算,

輸出是否能通過對初始狀態經過若干次移動到達該狀態。可以實現輸出1,否則輸出0。 初始狀態爲:ABCDE*    
   
    用戶輸入的格式是:先是一個整數n,表示接下來有n行狀態。程序輸出也應該是n行1或0  

    例如,用戶輸入:

3
ABCDE*
AB*DEC
CAED*B

    則程序應該輸出:
1
1
0


   資源約定:
峯值內存消耗 < 256M
CPU消耗  < 1000ms


     

java真是容易錯:交換自己寫,不要寫一個swap static函數來交換,因爲沒啥用

                             想在一個static函數裏改變一個數但不返回值這種,一定要用全局變量,要不然錯都不知道哪錯的

                             Map不賦初值就是null

代碼:

     



import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	static char a[][]={{'A','B','C'},{'D','E','*'}};
	static int dirx[]={0,0,1,-1};
	static int diry[]={1,-1,0,0};
	static Map<String, Integer> map=new HashMap<String, Integer>();
	public static void dfs(int x,int y){
		String s="";
		 for(int i=0;i<2;i++){
			 for(int j=0;j<3;j++)
				 s+=a[i][j];
		 }
		 if(map.get(s)!=null) return;
		 map.put(s, 1);
		 for(int i=0;i<4;i++){
			  int xx=x+dirx[i];
			  int yy=y+diry[i];
			 if(xx<0||xx>=2||yy<0||yy>=3) continue;
			 char t1=a[x][y];
			 a[x][y]=a[xx][yy];
			 a[xx][yy]=t1;
			 dfs(xx,yy);
			 char t2=a[x][y];
			 a[x][y]=a[xx][yy];
			 a[xx][yy]=t2;
		 }
	}
     public static void main(String[] args) {
		 Scanner scan=new Scanner(System.in);
		 dfs(1,2);
		 int n=scan.nextInt();
		 while(n--!=0){
			 String s=scan.next();
			 if(map.get(s)!=null){
				 System.out.println("1");
			 }
			 else{
				 System.out.println("0");
			 }
		 }
	}
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章