hdu6341 模擬 DFS 剪枝

2022-06-02 04:06:08 字數 1317 閱讀 9438

題目大意:

將16行16列的矩陣分成四行四列共16塊

矩陣的初始狀態每行及每列都不會出現重複的元素

給定乙個已旋轉過某些塊的矩陣 判斷其是由初始狀態最少經過幾次旋轉得到的

dfs列舉16個塊的旋轉方式

dfs過程中直接進行旋轉 一旦發現旋轉結果與之前列舉的塊的旋轉結果相悖就剪枝

這個剪枝已經足夠ac 也不妨在加一條當前旋轉次數比之前得到的可能答案大就剪枝

#include using

namespace

std;

#define inf 0x3f3f3f3f

#define ll long long

#define mem(i,j) memset(i,j,sizeof(i))

const

int n=1e5+5

;const

int mod=1e9+7

;int g[20][20], g[20][20

];int r[20][20], c[20][20

];int

ans;

#define w(i) (i-1)*4

#define wg(i,j,i,j) g[w(i)+i][w(j)+j]

intget(int r,int c,int x,int y,int

k) //

得到在r,c的塊內x,y位置在第k種旋轉之後的新數值

bool rotate(int i,int j,int

k)

return

ok;

} //

旋轉i,j塊 方式為第k種

void rerotate(int i,int

j) }

//將i,j塊的旋轉取消

void dfs(int x,int y,int

sum)

//四行四列16個塊 到第五行說明已列舉了所有塊的旋轉

for(int i=0;i<=3;i++)

//若發現這種旋轉方式會衝突就跳過

if(y==4) dfs(x+1,1,sum+i);

else dfs(x,y+1,sum+i);

rerotate(x,y);

}} //

搜尋列舉16個塊的旋轉方式

intmain()

}mem(r,

0); mem(c,0

); ans=inf; dfs(1,1,0

); printf(

"%d\n

",ans);

}return0;

}

view code

hdu6341 DFS暴搜 剪枝

題意 給乙個16 16的矩陣,由16個4 4的小矩陣構成。問最少將給出矩陣中的小矩陣順時針旋轉幾次可以滿足數獨條件 每一行 每一列 每乙個小矩陣都由1 f組成 思路 暴力列舉每個矩陣旋轉0 3次後的樣子,在每次旋轉填完後判斷當前矩陣是否合法 剪枝 include includeusing names...

DFS專攻 HDU 1010 DFS 奇偶剪枝)

這周專攻的第一道dfs終於領會了 繼續努力!剪枝的目的就是要省時 include include include include include include include include include include include define mem a,b memset a,b,siz...

hdu 4109 dfs 剪枝優化

求最久時間即在無環有向圖裡求最遠路徑 dfs 剪枝優化 從0節點 自己增加的 出發,0到1 n個節點之間的距離為1,mt i 表示從0點到第i個節點目前所得的最長路徑 include include include include include includeusing namespace std...