pku 1321 棋盘问题
#include <stdio.h>
#include <string.h>
char board[10][10];
int n,k,ans,chess;
bool r_used[10],c_used[10];
void dfs(int row)
{
if(chess==k)
{
ans++;
return ;
}
if(n-row < k-chess ) return ;
for(int j=0; j<n; j++)
{
if( board[row][j]=='#' && !r_used[row] && !c_used[j] )
{
r_used[row]=c_used[j]=true;
chess++;
dfs(row+1);
chess--;//chess是全局变量
r_used[row]=c_used[j]=false;
}
}
dfs(row+1);//搜索下一行
}
int main()
{
while(scanf("%d %d",&n,&k) && n!=-1 && k!=-1)
{
int i;
for(i=0; i<n; i++)
scanf("%s",board[i]);
// memset(r_used,false,sizeof(r_used));
// memset(c_used,false,sizeof(c_used));
ans=0;
chess=0;
dfs(0);
printf("%d\n",ans);
}
return 0;
}
//************************************************************************************************
#include <iostream>
using namespace std;
#define N 9
bool board[N][N],visited[N][N];
int n,k,ans;
bool isvalid(int row,int col)
{
for(int i=0; i<row; i++)
if(visited[i][col]) return false;
return true;
}
void dfs(int row,int chess)
{
if(chess==k)
{
ans++;
return ;
}
if( row>=n ) return ;
for(int j=0; j<n; j++)
{
if( !visited[row][j] && board[row][j] && isvalid(row,j) )
{
visited[row][j]=true;
dfs(row+1,chess+1);
visited[row][j]=false;
}
}
dfs(row+1,chess);
}
int main()
{
while(scanf("%d %d",&n,&k) && n!=-1 && k!=-1)
{
getchar();
memset(board,false,sizeof(board));
int i,j;
char ch;
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%c",&ch);
if(ch=='#')
board[i][j]=true;
}
getchar();
}
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
浙公网安备 33010602011771号