poj 1321 棋盘问题

来源:互联网 发布:亚裔女神asiafox 知乎 编辑:程序博客网 时间:2024/06/03 20:00

题意很简单- -;

解题思路:dfs搜索,逐行搜索,但需要注意当n!=k时,搜索完需要从当前行下一行继续搜索,具体见代码;

代码:

#include <iostream>#include <string.h>using namespace std;char map[10][10];int col[10];//列标记数组;int k,n;int cnt;void dfs(int row,int num){    if(num==k)    {cnt++;    return ;    }    if(row>n)//越界判定    return ;    for(int i=1;i<=n;i++)    {        if(map[row][i]=='#'&&!col[i])        {            col[i]=1;            dfs(row+1,num+1);            col[i]=0;        }    }    dfs(row+1,num);//这里是难点,当k<n时,row在等于n之前就可能已经把全部棋子放好                      //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了                        //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况}int main(){    while(cin>>n>>k)    {        if(n==-1&&k==-1) break;        cnt=0;        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            cin>>map[i][j];        }        memset(col,0,sizeof(col));        //memset()        dfs(1,0);        cout<<cnt<<endl;    }    return 0;}


0 0
原创粉丝点击