棋盘问题 (dfs) POJ

来源:互联网 发布:js闭包的好处 编辑:程序博客网 时间:2024/05/16 12:40

题目大意:给一个N*N的区域,和M个棋子,询问最后有多少种摆的方法,其中每个棋子不能放在同一行和同一列。

思路:对每一行进行dfs,dfs时使用book数组(双重标记)标记。

#include<stdio.h>#include<string.h> #define N 9char z[N][N];//开空间存储棋盘int num;//计算总数int bookh[N];//标记横行是否有过棋子int bookl[N];//标记纵行是否有过棋子int n,k;void dfs(int a,int m);int main(void){while(scanf("%d%d",&n,&k),n!=-1){memset(bookh,0,sizeof(bookh));memset(bookl,0,sizeof(bookl));num=0;getchar();int i;for(i=0;i<n;i++) gets(z[i]);for(i=0;i<=n-k;i++){//优化,因为只有前n-k行,才能存下k个棋子dfs(i,k);//dfs每一行}printf("%d\n",num);}return 0;}void dfs(int a,int m){if(m==0) {//num++;return ;}int i;for(i=0;i<n;i++){if(z[a][i]=='#'&&bookh[a]==0&&bookl[i]==0){//找到这一列中可以放置棋子的点if(m==1) {num++;//return ;}bookh[a]=1;bookl[i]=1;int j;                 for(j=a+1;j<=n-m+1;j++){//寻找下一行来放置棋子dfs(j,m-1);}bookh[a]=0;bookl[i]=0;}}return ;}

0 0
原创粉丝点击