代碼:
public class P1 {
static int m=4,n=6; int[][] map= { {1,1,1,1,1,1}, {0,1,0,1,0,1}, {1,1,0,1,0,1}, {1,1,1,1,1,1} }; int dir[][]= {{1,0},{0,1},{-1,0},{0,-1}}; int arr[]=new int[m*n*m]; int length=0; void f1(int x,int y) { if(x==m-1&&y==n-1) { for(int i=0;i<length;i++) System.out.print(arr[i]+","+(i%2==0?"":" ")); System.out.println(); return; } for(int i=0;i<4;i++) { int x1=x+dir[i][0]; int y1=y+dir[i][1]; if(x1>=0&&x1<m&&y1>=0&&y1<n&&map[x1][y1]==1) { map[x1][y1]=2; arr[length++]=x1; arr[length++]=y1; f1(x1, y1); map[x1][y1]=1; length-=2; } } } public static void main(String[] a) { new P1().f1(0, 0); } }
輸出:
0,1, 1,1, 2,1, 3,1, 3,2, 3,3, 3,4, 3,5,
0,1, 1,1, 2,1, 3,1, 3,2, 3,3, 2,3, 1,3, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5,
0,1, 1,1, 2,1, 2,0, 3,0, 3,1, 3,2, 3,3, 3,4, 3,5,
0,1, 1,1, 2,1, 2,0, 3,0, 3,1, 3,2, 3,3, 2,3, 1,3, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5,
0,1, 0,2, 0,3, 1,3, 2,3, 3,3, 3,4, 3,5,
0,1, 0,2, 0,3, 0,4, 0,5, 1,5, 2,5, 3,5, 數組
思路:
從起點向四個方向遍歷,若是能夠通行則該位置通行,存在數組arr中,並進行標註,若是走到終點輸出arr中的值測試
6x6的方格,沿着格子的邊線剪開成兩部分。
要求這兩部分的形狀徹底相同。spa
如圖:就是可行的分割法。
試計算:
包括這3種分法在內,一共有多少種不一樣的分割方法。
注意:旋轉對稱的屬於同一種分割法。code
請提交該整數,不要填寫任何多餘的內容或說明文字。blog
解題思路:題目要求沿着格子的邊線剪成兩個部分,仔細觀察,剪開的邊線是關於中心點(3,3)對稱的,因而咱們從點(3,3)開始搜索,it
public class fgfg {
public static int N=6; public static int [][]map=new int[N+1][N+1]; public static int count=0; public static int [][]dir= {{0,1},{1,0},{0,-1},{-1,0}}; public static void f1(int x,int y) { if(x==0||y==0||x==N||y==N) { count++; return; }else { for(int i=0;i<4;i++) { int x1=x+dir[i][0]; int y1=y+dir[i][1]; if(map[x1][y1]==1) continue; map[x1][y1]=map[N-x1][N-y1]=1; f1(x1,y1); map[x1][y1]=map[N-x1][N-y1]=0; } } } public static void main(String[] args) { map[N/2][N/2]=1; f1(3,3); System.out.println(count/4); }
}輸出:
509class
輸入
第一行輸入一個整數N,表示共有N組測試數據
每一組數據都是先輸入該地圖的行數m(0<m<100)與列數n(0<n<100),
而後,輸入接下來的m行每行輸入n個數,表示此處有水仍是沒水
(1表示此處是水池,0表示此處是地面)
輸出
輸出該地圖中水池的個數。
每一個水池的旁邊(上下左右四個位置)若是仍是水池的話的話,它們能夠看作是同一個水池。搜索