POJ 1321:棋盘问题

来源:互联网 发布:微信分享淘宝优惠券 编辑:程序博客网 时间:2024/06/11 09:26

点击打开题目链接

给出一个n*n的地图,只有#号位置能放置棋子,棋子之间不能同行或同列,求在地图上放置k枚棋子的方案数。

简单暴力搜索。

AC代码:

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int n,k,ans;char mp[10][10];int r[10],c[10];   ///r用来标记行,c用来标记列bool judge(int x,int y)  ///判断某个位置是否合法{    if(r[x]==0 && c[y]==0 && mp[x][y]=='#') return true;    else return false;}void dfs(int pos,int num){    int x = pos/n;    int y = pos%n;    if(num == k)    {        ans++;        return;    }    if(pos == n*n) return;    if(judge(x,y))    {        r[x] = 1;        c[y] = 1;        dfs(pos+1,num+1);        r[x] = 0;        c[y] = 0;    }    dfs(pos+1,num);  ///执行这一步说明位置不合法或合法不放置}int main(){    while(~scanf("%d%d",&n,&k))    {        if(n == -1 && k == -1)            break;        for(int i = 0; i < n; i++)            scanf(" %s",mp[i]);        memset(r,0,sizeof(r));        memset(c,0,sizeof(c));        ans = 0;        dfs(0,0);        printf("%d\n",ans);    }    return 0;}