演算法學習之路|方格分割

kissjz發表於2018-02-28

6×6的方格,沿著格子的邊線剪開成兩部分。

要求這兩部分的形狀完全相同。

試計算:

包括這3種分法在內,一共有多少種不同的分割方法。

注意:旋轉對稱的屬於同一種分割法。

請提交該整數,不要填寫任何多餘的內容或說明文字。

解題思路

首先建立一個模型:即從(3,3)開始一刀切,有多少種切法

應用演算法:深度遍歷/回溯

小技巧:

切痕為1,沒切的地方為0.

切過就無法再次切了,即遇到1回溯,遇到0就遍歷。

當成蝸牛型環路的時候因為最後四個方向都是1,所以一直回溯到出環路,這個問題無需考慮.

//方格分割
//暴力破解
#include <iostream>
using namespace std;
void dfs(int line,int column);

int times=0;
int map[7][7]={0};

int main(){
    dfs(3,3);
    cout<<times/4<<endl;//因為一開始(3,3)從四個方向出發,從一個方向深搜的結果與其他方向是相同的,只不過角度不同罷了。
    return 0;
}

void dfs(int line,int column){
    if(map[line][column]==1) return;//深度搜尋的時候防止返回原路並且保持圖片被一刀切兩半
    
    map[6-line][6-column]=1;//對稱型切法
    map[line][column]=1;//標記已經切開的路線
    if(line==0||column==0||column==6||line==6){//當與邊界相撞的時候,即是一刀切開成功的時候
        times++;
        map[6-line][6-column]=0;
        map[line][column]=0;//回溯
        return ;
    }
    
    dfs(line-1,column);
    dfs(line,column-1);
    dfs(line+1,column);
    dfs(line,column+1);//各種情況
    
    map[6-line][6-column]=0;
    map[line][column]=0;//回溯
}


相關文章