1. 思路:
①。 固定每一行,只需要判斷每一列是否符合條件即可,用乙個vis陣列來表示每一列是否被訪問。
②。因為要求是放k個棋子。所以cnt == k時return。
③。dfs中,當訪問當前所有的列後,如果滿足(總行數 - 已經過的行數 >= k - cnt),那麼可以在該行不放置棋子,考慮下一行,cnt不增加。
2.乙個要注意的點:
就是可以擺放的位置是'#',不是'.',我當時也懵了。以後一定要細心吶。
#include using namespace std;
int n, k, ans;
char chess[10][10];
bool vis[10];
void dfs(int r, int cnt)
if (r == n)
/*訪問當前行所有的列*/
for (int i = 0; i < n; i++)
} /* 如果下一行滿足條件,則本行不擺放棋子,考慮下一行是否擺放棋子。*/
if (n - 1 - r >= k - cnt) }
int main()
ans = 0;
dfs(0, 0);
cout << ans << endl;
} return 0;
}
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...