1. 程式人生 > >kuangbin專題一(A.棋盤問題)

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);}
}