POJ 1321 棋盤問題(DFS 狀壓DP)

2022-05-07 16:45:13 字數 1127 閱讀 1250

用dfs寫當然很簡單了,8!的複雜度,16ms搞定。

在discuss裡看到有同學用狀態壓縮dp來寫,就學習了一下,果然很精妙呀。

狀態轉移分兩種,當前行不加棋子,和加棋子。dp[i][j]中,i代表行數,j代表當前行棋子的狀態。j的二進位制中,1代表有旗子,0代表無棋子。

貼**~狀壓dp果然快一點。

#include #include 

intn,k,count;

bool mp[10][10

];int num[256

];int dp[9][256

];int

main()

}while(~scanf("

%d%d

",&n,&k) && n!=-1 && k!=-1

)

}int status=1

0,sizeof

(dp));

dp[0][0]=1

;

for(int i=1;i<=n;i++)}}

int ans=0

;

for(int i=0;iif(num[i]==k)

ans+=dp[n][i];

printf(

"%d\n

",ans);

}}

還有傳統的dfs……

#include #include 

intn,k,count;

bool mp[10][10

];bool col[10

];void dfs(int x,int

rest)

if(x>n)

return

;

for(int i=1;i<=n;i++) if(!col[i] &&mp[x][i])

if(rest+x<=n)

dfs(x+1

,rest);

}int

main()

}count=0

; dfs(

1,k);

printf(

"%d\n

",count);

}}

POJ 1321 棋盤問題(棋盤DFS)

棋盤問題 思路 分層查詢,逐行深搜。注意k n時的處理。1 include 2 include 3 include 4 include 5 include 6 include 7 include 8 include 9 include 10 define ll long long 11 define...

POJ 1321 棋盤問題 DFS

題意 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請程式設計求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案c。題解 include using namespace std define n 10 bo...

poj 1321 棋盤問題(DFS)

大概題意就是給你乙個棋盤,讓你放棋子,求在棋盤n n上的 放上k個棋子的所有情況的數目。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列。深搜可以搜尋出所有答案。直接看 include includebool chess 9 9 bool vis col 9 int n,k,ans void...