//头文件
//杨氏矩阵,1~9填入3*3矩阵,由左向右递减,由上向下递减。

#include<iostream>
using namespace std;

class grid
{
public:
    void outputjz();           //输出矩阵
    void arrange();            //求解并输出
    grid()                     //构造函数
    {
        arrange();
    }
private:
    int board[3][3];
    void outputRowBoard()     //输出格线行
    {
        int i;
        cout<<"+";
        for(i=0;i<5;i++)
            cout<<"-";
        cout<<"+"<<endl;
    }
    void outputRowBoard(int i)//输出数据行
    {
        int j;
        for(j=0;j<3;j++)
            cout <<"|"<<board[i][j];
        cout<<"|";
    }
    void dataInit()           //初始化数据
    {
        int i,j,k;
        for(i=0,k=1;i<3;i++)
            for(j=0;j<3;j++,k++)
                board[i][j]=k;
    }
    bool dataEnd()            //数据结束检测
    {
        int i,j,k;
        for(i=0,k=9;i<3;i++)
            for(j=0;j<3;j++,k--)
                if(board[i][j]!=k)
                    return false;
        return true;
    }
    void dataNext()           //取下个数据
    {
        int i,j;
        for(i=2;i>=0;i--)
            for(j=2;j>=0;j--)
                if(board[i][j]=9)
                    board[i][j]=1;
                else
                {
                     board[i][j]++;
                     return;
                }
    }
    bool dataDifferent()      //数据重复检测
    {
        int i,j;
        int digit[10];
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                digit[board[i][j]]=1;
        for(i=1,j=0;i<10;i++)
            j+=digit[i];
        if(j==9)
            return true;
        return false;
    }
    bool dataFirst()            //检测首位条件是否符合
    {
        if(board[0][0]!=9)
            return false;
        return true;
    }
    bool dataLast()          //检测最后位条件是否符合
    {
        if(board[2][2]!=1)
            return false;
        return true;
    }
    bool dataRow()           //检测行条件是否符合
    {
        int i,j,k,x;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                k=board[i][j];
                x=board[i+1][j];
            }
            if(x>k)
                return false;
        }
        return true;
    }
    bool dataColumn()       //检测列条件是否符合
    {
        int i,j,k,x;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
            {
                k=board[i][j];
                x=board[i][j+1];
            }
            if(x>k)
                return false;
        }
        return true;
    }
    bool dataCheck()
    {
        if(!dataDifferent())
            return false;
        if(!dataFirst())
            return false;
        if(!dataLast())
            return false;
        if(!dataRow())
            return false;
        if(!dataColumn())
            return false;
        return true;
    }
};
void grid::outputjz()
{
    int i;
    outputRowBoard();
    for(i=0;i<3;i++)
    {
        outputRowBoard(i);
        outputRowBoard();
    }
}
void grid::arrange()
{
    int n=1;
    for(dataInit();!dataEnd();dataNext())
    {
        if(dataCheck())
        {
            cout <<"第"<<n<<"个结果:"<<endl;
            n++;
            outputjz();
        }
    }
}

//cpp文件
//讲1~9填入3*3杨氏矩阵中,输出所有可能结果。

#include<iostream>
using namespace std;

#include"young.h"

int main()
{
    grid a();
}

//运行以后没有输出的,只有一个

//“请按任意键继续。。。”