• 九宫幻方


    记录好缺少部分的坐标,用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;
    }
  • 相关阅读:
    权值线段树 学习笔记
    Codeforces Round #585 (Div. 2)
    a题解
    01Trie学习笔记
    学习笔记--线段树合并与分裂
    [NOIP10.6模拟赛]1.merchant题解--思维+二分
    [NOIP10.6模拟赛]2.equation题解--DFS序+线段树
    [NOIP10.5模拟赛]1.a题解--离散化+异或线段树
    [NOIP10.5模拟赛]3.c题解--思维
    [NOIP10.3模拟赛]3.w题解--神奇树形DP
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8458061.html
Copyright © 2020-2023  润新知