按照行的順序遍歷,其中dfs(int x,int count)表示第x行已放置count個棋子狀態下遍歷放置的程序,需要注意的是for回圈之后必須要加上一個dfs因為不能保障每一行都可已找到一個可以放下的位置,
#include<stdio.h>
#include<iostream>
using namespace std;
char c[10][10];
int visit[10]={1000,1000,1000,1000,1000,1000,1000,1000,1000,1000};
int n,k;
int numbers=0;
void dfs(int x,int count){//行數(狀態,遞回這行為起點的路徑),放的棋子數 ,狀態的行數對應遞回
int flag = 0;
if(x>=n)//當所搜索的行數大于棋盤時 直接回傳
return ;
for(int i=0;i<n;i++){
flag = 0;
if(c[x][i]=='#'){//if(c[x+1][i]=='#'){
for(int j=0;j<=count;j++){
if (i==visit[j]){
flag = 1;
break;
}
}
if(flag == 0){
visit[count]=i;
if(count+1==k){
numbers = numbers+1;
}
dfs(x+1,count+1);
visit[count]=1000;
}
else{
continue;
}
}
else{
continue;
}
}
dfs(x+1,count);
return ;
}
int main(){
numbers = 0;
while(cin>>n>>k){
if(n==-1&&k==-1)
break;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>c[i][j];
}
}
dfs(0,0);
cout<<numbers<<endl;
numbers = 0;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/1486.html
標籤:區塊鏈
