把放棋子分成一个个的小问题
把放n行 一点点减少 变成放n-1行 n-2行 n-3行…

#include <iostream>
using namespace std;
int ans;
int n, x;
string s[10];
int dp[10];
void dfs(int k, int x)
{
    if (x == 0)
    {
        ans++;
        return;
    }
    for (int i = k; i < n; ++i)
    {
        for (int j = 0; j < n; j++)
        {
            if (s[i][j] == '#')
            {
                int t = 0;

                //检查同行
                for (int p = 0; p < n; ++p)
                {
                    if (s[i][p] == '*')
                    {
                        t = 1;
                        break;
                    }
                }
                
                //检查同列
                for (int o = 0; o < n; o++)
                {
                    if (s[o][j] == '*')
                    {
                        t = 1;
                        break;
                    }
                }
                //如果同行或同列有 就不行
                if (t)
                    continue;
                //能放的就给他标记一下
                s[i][j] = '*';
                // dp[j] = 1;
                dfs(i + 1, x - 1);
                s[i][j] = '#';
                // dp[j] = 0;
            }
        }
    }
}
int main()
{
    while (1)
    {
        cin >> n >> x;
        if (n == -1 && x == -1)
            break;
        ans = 0;
        getchar();
        for (int i = 0; i < n; ++i)
        {
            cin >> s[i];
        }
        dfs(0, x);
        cout << ans << endl;
    }
    return 0;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐