POJ 1321 棋盘问题(DFS深度优先搜索/回溯法)

//DFS深度优先搜索/回溯法/八皇后类型题 #include<iostream> using namespace std; char map[9][9]; int vis[9];//vis数组标记当前列是否已有其他棋从而提高效率 int n,c,tot; void dfs(int l,int cnt)//cnt当前还有多少棋子要摆放 { if(cnt == 0) //递归边界,所有棋子已合理摆放完毕 { tot++;//解个数 return; } if(n-l+1 < cnt) return;//剩余行数不足够摆放剩余棋子,则跳出 else dfs(l+1,cnt);//若足够,则空掉当前行继续递归 if(cnt > 0) { for(int i = 1;i <= n;++i) { if(map[l][i] == '.')continue; else { if(!vis[i])//当前列还没有摆放过棋子 { vis[i] = 1; dfs(l+1,--cnt); vis[i] = 0;//DFS出口恢复修改值 ++cnt;//DFS出口恢复修改值 } } } } } int main() { while(cin >> n >> c) { if(n == -1)break; tot = 0; for(int i = 1;i <= n;++i) for(int j = 1;j <= n;++j) cin >> map[i][j]; dfs(1,c); cout << tot << endl; } return 0; } 

你可能感兴趣的:(POJ 1321 棋盘问题(DFS深度优先搜索/回溯法))