kuangbin專題一(A.棋盤問題)
阿新 • • 發佈:2018-11-07
此題思路:和九宮格思路差不多,出現不能放在一行或者一列或者對角線(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);} }