蓝桥杯 九宫幻方

注意:第一次写dfs内用了二重循环,外层为位置,内层为未使用过的数字,存在先填充了后面又返回填充前面的情况,导致许多重复,按照样例给出的得出5!=120的结果......还是太菜了

后来参考了此博客:https://blog.csdn.net/h_hui_hui/article/details/79499183?utm_source=blogxgwz7

应该是按位置dfs,已经存在数据的位置跳过,直接下一个位置。此篇博客仅供记录错误

#include<bits/stdc++.h>
using namespace std;

int a[10];
int out[10];
bool vis[10];
int ans;

bool check()
{
    int sum = a[1] + a[2] + a[3];
    for(int i = 4; i <= 7; i += 3)
    {
        if(a[i] + a[i + 1] + a[i + 2] != sum)
            return false;
    }

    for(int i = 1; i <= 3;  i++)
    {
        if(a[i] + a[i + 3] + a[i + 6] != sum)
            return false;
    }

    if((a[1] + a[5] + a[9] != sum )|| (a[3] + a[5] + a[7] != sum) )
        return false;

    return true;
}


void dfs(int pos)
{
    if(pos == 10)
    {
        if(check())
        {
            ans++;
            if(ans == 1)
                memcpy(out, a, sizeof(a));
            return;
        }
        return;
    }

    if(a[pos])
    {
        dfs(pos + 1);
        return;
    }

    for(int i = 1; i <= 9; i++)
    {
        if(!vis[i])
        {
            a[pos] = i;
            vis[i] = 1;
            pos++;
            dfs(pos);
            vis[i] = 0;
            pos--;
            a[pos] = 0;
        }
    }
}


int main()
{
    for(int i = 1; i <= 9; i++)
    {
        scanf("%d", &a[i]);
        if(a[i])
        {
            vis[a[i]] = 1;
        }
    }
    ans = 0;
    dfs(1);
    if(ans == 1)
    {
        for(int i = 1; i <= 9; i++)
        {
            if(i % 3 == 0)
                cout << out[i] << endl;
            else
                cout << out[i] << " ";
        }
    }
    else
        cout << "Too Many" << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38577732/article/details/88673415