kuangbin专题一(A.棋盘问题)

题目链接

此题思路:和九宫格思路差不多,出现不能放在一行或者一列或者对角线(x+y)||(n+x-y),用一维数组表示。

坑点:1.该行可以选与不选,像我就忘了不选该行,卡了很长时间。

           2.不选的该行,放在选的情况外即for外,防止该行可以选多个点,每次不选该行都成立,结果重复多记。

           3.递归出口的时候把total,放在大于n的前面,如果放在后面就会出现刚好等于n,满足了total等于k的情况,大于n放在前面会把这次成立的条件忽略不记。

           4.读取字符注意%c的回车符,前面加个空格,注意dfs的参数,大于n从dfs(1)开始,等于n从dfs(0)开始。

#include <iostream>  
#include <stdio.h>  
#include <string.h>   
#include <stack>  
#include <queue>   
#include <map>  
#include <set>  
#include <vector>  
#include <math.h>  
#include <bitset>  
#include <algorithm>  
#include <climits>  
using namespace std;  
#define lson 2*i  
#define rson 2*i+1 
#define Pair pair<int, int> 
#define ULL unsigned long long
#define LS l,mid,lson  
#define RS mid+1,r,rson  
#define up(i,x,y) for(int i=x;i<y;i++)  
#define down(i,x,y) for(int i=x;i>=y;i--)  
#define MEM(a,x) memset(a,x,sizeof(a))  
#define W(a) while(a)  
#define gcd(a,b) __gcd(a,b)  
#define LL long long  
#define N 1e5+5  
#define MOD 1000000007  
#define INF 0x3f3f3f3f  
#define EXP 1e-8  
#define lowbit(x) (x&-x)  
#define _  ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
int a[30],b[30],c[30],d[30];
char maze[25][25];
int n,k,sum;
void dfs(int x,int total){//total为棋的个数 ,x为行,以行dfs 

	if(total==k){
		sum++;
		return;//这个注意这个if的位置  
	}
		if(x>n){
		return;
	}
	
		for(int i=1;i<=n;i++){//选该行,在行的基础上,检查列的位置是否符合条件 
			if(b[i]==0&&maze[x][i]=='#'){//满足条件进行下一步dfs 
				a[x]=i;//标记 
				b[i]=1;
				dfs(x+1,total+1);//步数加一 
				a[x]=0;//取消标记 
				b[i]=0;
				
			}
		}
		dfs(x+1,total); //不选该行 
	}

int main(){
	while(~scanf("%d%d",&n,&k)&&(n!=-1)){
	sum=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			scanf(" %c",&maze[i][j]);
		}
	}
	dfs(1,0);
	printf("%d\n",sum);}
} 







猜你喜欢

转载自blog.csdn.net/a2392008643/article/details/82562936