kuangbin巨巨第一题
棋盘问题
代码
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int n,m;
char maze[10][10];
int bol[10];
int sum;
void search(int cur,int tot)\\重难点讲解在下边;
{
if(tot==m){
sum++;
return ;
}
if(cur==n)
return ;
else
{
for(int i=0;i<n;i++)
{
if(maze[cur][i]=='#'&&bol[i]==0)
{
bol[i]=1;
search(cur+1,tot+1);
bol[i]=0;\\回溯很重要
}
}
search(cur+1,tot);
}
}
int main()
{
while(cin>>n>>m&&n!=-1&&m!=-1){
memset(maze,0,sizeof(maze));
memset(bol,0,sizeof(bol));
sum=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>maze[i][j];
}
}
search(0,0);
cout<<sum<<endl;
}
return 0;
}
search函数的两个参数,cur是第cur行,tot是现在已经放置了几个棋子
某一行可以选择放或者不放
因为这个题要求不能放在同一行或者同一列
每一行只放一个就只需要考虑其他的不在同一列就好
比如第i列放置了棋子,那么bol[i]就变成1
切记回溯