#1268 : 九宫 [DFS]

用dfs枚举所有情况

#include <bits/stdc++.h>
using namespace std;
int mp[10],vis[10],ans[10],mark[10];
int cnt;
bool check()
{
    int sum;
    for(int i=0;i<3;i++)
    {
        sum=0;
        for(int j=0;j<3;j++)
            sum+=mp[3*i+j];
        if(sum!=15)
            return false;
        sum=0;
        for(int j=0;j<3;j++)
            sum+=mp[i+3*j];
        if(sum!=15)
            return false;
    }
    if(mp[0]+mp[4]+mp[8]!=15)
        return false;
    if(mp[2]+mp[4]+mp[6]!=15)
        return false;
    return true;
}
void dfs(int p)
{
    if(p==9)
    {
        if(check())
        {
            cnt++;
            for (int i=0;i<9;i++)
                ans[i] = mp[i];
        }
        return;
    }
    if(vis[p])
        dfs(p+1);
    else
    {
        for(int i=1;i<=9;i++)
        {
            if(!mark[i])
            {
                //cout<<p<<" "<<i<<endl;
                mp[p]=i;
                mark[i]=1;
                dfs(p+1);
                mark[i]=0;
            }
        }
    }
    return;
}

int main()
{
    cnt=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            scanf("%d",&mp[3*i+j]);
            if(mp[3*i+j]!=0)
            {
                vis[3*i+j]=1;
                mark[mp[3*i+j]]=1;
            }
        }
    }
    dfs(0);
    if(cnt==1)
    {
        for(int i=0;i<3;i++)
        {
            printf("%d",ans[i*3]);
            for(int j=1;j<3;j++)
                printf(" %d",ans[i*3+j]);
            printf("\n");
        }
    }
    else if(cnt>1)
        printf("Too Many\n");

}
View Code

 

posted on 2019-08-05 09:28  FTA_Macro  阅读(153)  评论(0编辑  收藏  举报

导航