棋盘问题(dfs,递归)

按照行的顺序遍历,其中dfs(int x,int count)表示第x行已放置count个棋子状态下遍历放置的过程。需要注意的是for循环之后必须要加上一个dfs因为不能保障每一行都可已找到一个可以放下的位置。

#include
#include
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;
	}
} 

你可能感兴趣的:(算法)