当前位置: 代码迷 >> 综合 >> poj 1321 棋盘数组
  详细解决方案

poj 1321 棋盘数组

热度:46   发布时间:2023-12-14 22:37:16.0

用递归 dfs  回溯即可

#include<iostream>
using namespace std;
#define N 10
char mat[N][N];
int vis[N],c;
void dfs(int n,int k,int row)
{
if(k==0)
{
c++;
return ;
}
if(row>n-1)
return;
for(int j=0;j<n;j++)
{
if(mat[row][j]=='#')
{
bool flag=true;
for(int i=0;i<row;i++)
{
if(vis[i]==j)
{
flag=false;
break;
}
}
if(flag)
{
vis[row]=j;
dfs(n,k-1,row+1);
}
}
}
dfs(n,k,row+1);
}
//void dfs(int row,int n,int cur,int k)
//{
//	if(cur==k)
//	{
//		c++;
//		return;
//	}
//	else
//	{
//		for(int i=row;i<n;i++)
//			for(int j=0;j<n;j++)
//			{
//				if(mat[i][j]=='#'&&vis[j]==0)
//				{
//					vis[j]=1;
//					dfs(row+1,n,cur+1,k);
//					vis[j]=0;
//				}
//			}
//	}
//}
int main()
{
int n,k;
while(cin>>n>>k)
{
if(n==-1&&k==-1)
break;
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cin>>mat[i][j];
}
vis[i]=0;
}
c=0;
dfs(n,k,0);
//dfs(0,n,0,k);
cout<<c<<endl;
}
return 0;
}