poj 1321——棋盘问题(DFS)

来源:互联网 发布:seo系统培训 编辑:程序博客网 时间:2024/06/05 07:20

题目地址http://poj.org/problem?id=1321

解题思路:经典基础的DFS(深搜)题目!初学DFS,于是学习了一下别人的代码...

#include <stdio.h>#include <string.h>#include <stdlib.h>int n,k,chess[9][9],visit[9],status;void DFS(int row,int num) //深搜{int j;if(num==k) //如果已填充的棋子数等于k,则棋子放置方法+1{status++;return ;}if(row>n) //越界return ;for(j=1;j<=n;j++){if(chess[row][j] && !visit[j]) //可以放置且该点未被访问过{visit[j]=1; //标记已访问DFS(row+1,num+1); //已填充的棋子数+1,继续对下一行进行深搜visit[j]=0; //回溯法。回溯后,说明棋子的状态已被记录,当前标记还原}}DFS(row+1,num); //[转]k<n时,row在等于n之前可能已把棋子全部放好,又由于全部棋子放好后的状态在前面的循环中已经被记录过,为处理多余行,当前位置先不放棋子return ;}int main(){int i,j;char c;while(scanf("%d %d",&n,&k),n!=-1,k!=-1){status=0;memset(chess,0,sizeof(chess));memset(visit,0,sizeof(chess));getchar();for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%c",&c);if(c=='#')chess[i][j]=1;}getchar();}DFS(1,0); //row=1,num=0。从第一行开始进行深搜,填充棋子为0printf("%d\n",status);}return 0;}


 

原创粉丝点击