poj 1321 深搜题

 

题目有些类似八皇后的问题,棋盘的形状是什么样对于解题并无影响,难点在于如何处理

给定棋子数 和 棋盘行列数数的关系;

行列数n = k 时,

k<n时

 

#include<iostream>
#include<string>

using namespace std;

int n,k,sum;
char map[10][10];//二维数组存储数据
bool fangzhi[110];//判断棋盘中是否放置了棋子,标记作用
void dfs(int x,int y)//x 指代的是棋盘搜索的行数, y代表的是已经放置的棋子数
{
if(y == k) // 如果已经放置的棋子数等于 题目中要求放置的棋子数,那么方案数sum加1; 
{
sum ++;
return;
}
if(x >n) //如果行数超过了图的范围,返回
{
return;
}
for(int i=1;i<=n;i++) 
{
if(!fangzhi[i] && map[x][i] == '#')
{
fangzhi[i] = 1;//如果第x行 的第i个数满足条件,则放置上棋子,然后继续往下一行下一列搜索;
dfs(x+1,y+1);
fangzhi[i] = 0; 还原棋子,以便后面能继续搜索其他方案
}
}
dfs(x+1,y);//这是棋子数小于棋盘行列数的情况
}
int main()
{
while(cin>>n>>k,n != -1 && k != -1)
{
memset(fangzhi,0,sizeof(fangzhi));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cin>>map[i][j];
}
sum = 0;

dfs(1,0); //从第一行开始搜索
cout<<sum<<endl;
}
}

posted on 2012-11-02 16:35  元点之始  阅读(177)  评论(0编辑  收藏  举报

导航