九宫幻方

记录好缺少部分的坐标,用next_permutation进行穷举,就可以得到答案了

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <string.h>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 3000
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

int mat[3][3];

bool isOK(){
    int i,j,sum=0;
    for(i=0;i<3;i++){
        sum=0;
        for(j=0;j<3;j++){
            sum+=mat[i][j];
        }
        if(sum!=15) return false;
    }
    for(i=0;i<3;i++){
        sum=0;
        for(j=0;j<3;j++){
            sum+=mat[j][i];
        }
        if(sum!=15) return false;
    }
    sum=0;
    for(i=0;i<3;i++) sum+=mat[i][i];
    if(sum!=15) return false;
    sum=0+mat[2][0]+mat[1][1]+mat[0][2];
    if(sum!=15) return false;
    return true;
}

int main(){
//    freopen("D:/CbWorkspace/blue_bridge/九宫幻方.txt","r",stdin);
    vector<int> kx,ky,num;
    int cnt=0;
    int hash[11]={0};
    int ans[3][3];
    int i,j;
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            I("%d",&mat[i][j]);
            if(!mat[i][j]){
                kx.push_back(i);
                ky.push_back(j);
            }
            hash[mat[i][j]]++;
        }
    } 
    for(int i=1;i<=9;i++) if(!hash[i]) num.push_back(i);
    do{
        for(i=0;i<kx.size();i++){
            mat[kx[i]][ky[i]]=num[i];
        }
        if(isOK()){
            FF(i,3)FF(j,3)ans[i][j]=mat[i][j];
            cnt++;
            if(cnt>=2) break;
        }
    }while(next_permutation(num.begin(),num.end()));
    if(cnt>=2){
        puts("Too Many");
    }else{
        FF(i,3){
            FF(j,3){
                printf("%d",ans[i][j]);
                if(j!=2) printf(" ");
            }
            puts("");
        } 
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TQCAI/p/8458061.html