DFS&BFS入门
棋盘问题:
题目链接:http://poj.org/problem?id=1321
题目思路:
用dfs,由题意可知每行每列只能有一个棋子,定义数组v标记每行是否有棋子,全局变量num,如果num等于所想要摆放的棋子数量,摆放总数就加一。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<queue>
#define N 100000+5;
#define INF 0xc0c0c0c0
using namespace std;
typedef long long ll;
char a[2222][2222];//棋盘
int v[22222];//标记此行是否有棋子
int n,k,num=0,ans=0;
void dfs(int j)
{
if(num==k)//如果棋子数等于想要摆放的棋子
{
ans++;//摆放方法加一
return ;
}
if(j>=n)//超过边界返回
return ;
for(int i=0; i<n; i++)
{
if(v[i]==0&&a[j][i]=='#')
{
num++;
v[i]=1;//标记此行
dfs(j+1);//搜索下一行
v[i]=0;//如果搜索失败或棋子数量足够撤回标记
num--;//棋子数量减一
}
}
dfs(j+1);//如果这有棋子搜索下一行
}
int main()
{
while(cin>>n>>k)
{
if(n==-1&&k==-1)
break;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
cin>>a[i][j];//输入棋盘
}
}
dfs(0);//从第一行开始搜索
cout<<ans<<endl;
ans=0,num=0;//多组输入,每次都要初始化
}
return 0;
}