一開始想的時候標記想錯了,其實標記只要一組對列的標記就夠,這樣在行往下的過程中,行每行確定只放一個了,與一般dfs還有一點不同的是,這個有可能出現棋子數不足的情況,這就要求在dfs過程中,需要分放和不放兩種,在放的部分中代碼再體現出行的標記變換
還有個有點陰的地方是#是可以放的,迷宮題做多了都默認#是不行的了 - -
#include <iostream>
#include <cstring>
using namespace std;
int n,k;
int vis[10];
char m[10][10];
int count = 0;
int total = 0;
void dfs(int x)
{
if(total==k)
{
count++;
return ;
}
if(x>=n)
{
return ;
}
for(int j=0;j<n;j++)//在這一行放
{
if(vis[j]==0&&m[x][j]=='#')//只考慮同一列不能放
{
vis[j] = 1;
total++;
dfs(x+1);
vis[j] = 0;
total--;
}
}
dfs(x+1);// 因爲不等額 在這一行直接不放
}
int main(void)
{
while(1)
{
total = 0;
count = 0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&k);
if(n==-1&&k==-1)
{
return 0;
}
for(int i=0;i<n;i++)
{
scanf("%s",m[i]);
}
dfs(0);
printf("%d\n",count);
}
}