1321 棋盘问题 题解


题解:dfs搜索
代码:
#include <iostream>
#include <cstring>
using namespace std;
char mp[10][10];//存#和.
int vis[10];//做标记,走过1,没走过0
int k,sum,n;
int dfs(int x,int cnt)//x表示的是当前行,cnt是放的棋子数
{
if(cnt==k)
{
sum++;//放的棋子数正好等于所有的棋子数,正好都放完,方案加1
}
for(int i=x;i<n;i++)//继续往下搜
{
for(int j=0;j<n;j++)
{
if(vis[j]==0&&mp[i][j]=='#')//没走过
{
vis[j]=1;//标记已经走过
dfs(i+1,cnt+1);//行数加一,棋子数加一
vis[j]=0;//恢复原来的样子,因为要走第二次,看有没有其他的情况
}
}
}
}
#include <cstring>
using namespace std;
char mp[10][10];//存#和.
int vis[10];//做标记,走过1,没走过0
int k,sum,n;
int dfs(int x,int cnt)//x表示的是当前行,cnt是放的棋子数
{
if(cnt==k)
{
sum++;//放的棋子数正好等于所有的棋子数,正好都放完,方案加1
}
for(int i=x;i<n;i++)//继续往下搜
{
for(int j=0;j<n;j++)
{
if(vis[j]==0&&mp[i][j]=='#')//没走过
{
vis[j]=1;//标记已经走过
dfs(i+1,cnt+1);//行数加一,棋子数加一
vis[j]=0;//恢复原来的样子,因为要走第二次,看有没有其他的情况
}
}
}
}
int main ()
{
while (cin>>n>>k&&n!=-1&&k!=-1)
{
memset(vis,0,sizeof(vis));//把所有的地方都标记成0。
sum=0;//计算个数
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>mp[i][j];
}
}
dfs(0,0);//从第0行搜,用的棋子数是0.
cout<<sum<<endl;
}
return 0;
}
{
while (cin>>n>>k&&n!=-1&&k!=-1)
{
memset(vis,0,sizeof(vis));//把所有的地方都标记成0。
sum=0;//计算个数
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>mp[i][j];
}
}
dfs(0,0);//从第0行搜,用的棋子数是0.
cout<<sum<<endl;
}
return 0;
}
浙公网安备 33010602011771号