POJ - 1321 A - 棋盘问题

A - 棋盘问题

http://poj.org/problem?id=1321

思路:不能搞双重循环嵌套,要注意可以跳过某行

代码

#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
int n, k, res, cnt;
char a[10][10];
bool vis[10];

void dfs (int x) {
    if (res == 0) {
        cnt ++;
        //cout << cnt << endl;
        return ;
    }
    if (x == n ) {
        return ;
    }

    
        for (int j = 0; j < n; j ++) {
            if (a[x][j] == '.' || vis[j] )
                continue;
            vis[j] = true;
            //a[x][j] = '$'; //放置
            res --;
            dfs (x + 1);
            res ++;
            vis[j] = false;
            //a[x][j] = '#'; 
        }
    dfs (x + 1); //就是漏了这行
    //这个是关键,因为 k <= m,因此可能有行不用放棋子,所以我们要手动舍弃行,直接进入下一行 
}

int main () {
    while (scanf ("%d %d", &n, &k) && n != -1 && k != -1) {
        memset (vis, false, sizeof vis);
        for (int i = 0; i < n; i ++)
            scanf("%s", &a[i]);

        res = k, cnt = 0;
        dfs (0);
        printf ("%d\n", cnt);
    }

}
posted @   Sakana~  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示