您的位置:首页 > 其它

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

2010-03-03 12:26 232 查看
//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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: