遞歸2尋路之dfs

練習:

1給定一個迷宮矩陣,入口,出口,輸出走出迷### 宮的全部路徑

代碼:
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

如圖:就是可行的分割法。
image
image
image
試計算:
包括這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表示此處是地面)
輸出
輸出該地圖中水池的個數。
每一個水池的旁邊(上下左右四個位置)若是仍是水池的話的話,它們能夠看作是同一個水池。搜索

---------------------------------------------------------Zzh

相關文章
相關標籤/搜索