您的位置:首页 > 其它

POJ - 1321 棋盘问题 解题报告

2017-02-12 21:12 337 查看
题目大意:

让你在一个n*n(n<=8)的棋盘中放k(k<n)个棋子,要求每个棋子都不能在同一行或者同一列 。然后你得输出对于每个棋盘有多少种摆放方式。类似于组合而不是排列。

#include
#include
#include
#include
#define N 10
using namespace std;
char map

={0};
bool vis

={0};
int n,k;
int s=0;
//bool viss

={0};

void input()
{
char l;
l=getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
scanf("%c",&map[j]);
}
}
}

void dfs(int x,int y,int m)//从(x,y)开始搜索,并且该点为第m个
{
vis[x][y]=1;
if(m==k)
{
s++;
return;
}
for(int i=x+1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
//if(viss[i][j]==1)continue;
if(vis[i][j]==1)continue;
int flag=0;
for(int h=1;h<=n;h++)
{
if(vis[h][j]==1||vis[i][h]==1)
{
flag=1;break;
}
}
if(flag==1)continue;
if(map[i][j]=='.')continue;
//cout<[i]>n>>k)
{

if(n==-1&&k==-1)break;
s=0;
input();
//ceshi1();
//memset(viss,0,sizeof(viss));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
memset(vis,0,sizeof(vis));
if(map[i][j]=='.')continue;
dfs(i,j,1);
//viss[i][j]=1;
}
}
cout<


注:感觉搜索还是要反复熟悉代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息