用dfs寫當然很簡單了,8!的複雜度,16ms搞定。
在discuss裡看到有同學用狀態壓縮dp來寫,就學習了一下,果然很精妙呀。
狀態轉移分兩種,當前行不加棋子,和加棋子。dp[i][j]中,i代表行數,j代表當前行棋子的狀態。j的二進位制中,1代表有旗子,0代表無棋子。
貼**~狀壓dp果然快一點。
#include #includeintn,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 #includeintn,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...