ソフトウェア工学2019第3の動作

GitHubのアドレス

https://github.com/Aurora-gloam/031702411

タイトル

Baiduの百科事典の説明:
数独は、ディスクで9つの宮殿、各宮殿が9個の小細胞に分かれています。デジタル知られており、論理および推論を使用して、この八十から一グリッドを解決する特定の条件を考えると、他の空間に番号1-9を入力します。1-9ので、各番号は、としても知られている各行、各列および各宮殿、一度だけ表示されていることを「正方形」。
数独と呼ばれるコマンドラインプログラムを実装します。

PSPテーブル

PSP2.1 パーソナルソフトウェアプロセス段階 それがかかると予想される(分) 実際の時間がかかる(分)
プランニング プログラム(この作業は多くの時間の見積もりが必要です) 60 60
開発 開発 905 785
分析 (新しい技術を学ぶ含む)ニーズ分析 120 90
デザインスペック 設計ドキュメントの生成 60 30
デザインレビュー デザインレビュー 30 10
標準コーディング コードの仕様(現在の開発のための適切な規範の開発) 5 5
設計されました 具体的な設計 60 40
コーディング 具体的なコーディング 480 360
コードレビュー コードレビュー 30 10
テスト 検査(セルフテスト、コードを変更し、変更を提出) 120 240
報告 レポート 290 230
テストrepor テストレポート 30 30
サイズ測定 コンピューティングのワークロード 20 20
死後&プロセス改善計画 後知恵とは、プロセス改善計画を提案します 240 180
トータル 1255 1075

問題解決のためのアイデア

  ジョブの要件を確認するために始めているだけでは停止し、私は私が最初にすべての数独を解決するだろうかと思いました。私はその家に現れたの行の値は、その列は、記入する可能性から除外することができます番号を確認する場所のスペースを埋めるために必要がある必要があります。そして、最初の塗りつぶしを埋めることができ、残りの数字を選択し、空白の数、最後のと同じように考えるのプロセスを埋めるために、次の必要性を検討してください。すべてのスペースを記入、または数字が表示されずに充填することができるまで、それはケースとなっています。スペースは、列が、宮殿はすべての数字が表示されている行は、当時デジタル塗りつぶし他の番号に空白を埋めるためにした場合に充填することができます。そして、埋めるために下向きのスペースを追いました。あなたはすべてのスペースを記入した場合。そして、この数独を解きます。それから私は私のプログラムは、同じ方法に従って、それ自体が独立させることができるようにしたかったです。

デザインのアイデア

  • まず、クラスの構築数独は、我々はスペースを埋めるために必要なだけのディスクを表し、行はスペースを含む、行COLは、値を埋めることヴァルは、可能なデジタルの数の合計が設定され、対応するデータメンバとアクセス機能。
  • 第二に、行、列を参照するスペースのデザインは、宮殿番号の機能があったチェック配列保存された結果は、数字の発生を示す配列のインデックス値は、数字列は、より低い発生によって表される数を表します。
  • もう一度、機能番号再埋めるために、以前のデザインにスペースを返す戻りますクラスの合計、それが可能な保存された各種の充填されている場合は、判断されたvalを、そうでない場合は呼び出しを続けるバック機能を。
  • 最後に、二次元配列の定義SUは、数独ディスクを格納します。クラスオブジェクトS、ディスク格納する二次元アレイSUならびにデジタルストレージアレイの出現グローバル変数のセット。

コード説明

1.类sudoku

class sudoku
{
private:
    int row;
    int col;
    int sum;// 为val数组可达到的最大下标 
    int val[9];
public:
    void setrow_col(int r, int c);
    void setsum();
    void setval_sum(int num);
    int getval(int t);
    int getsum();
    int getrow();
    int getcol();
};
void sudoku::setrow_col(int r, int c)//对数据成员行、列进行赋值 
{
    col = c;
    row = r;
}
void sudoku::setsum()//每回到一次此空格重新填入,数值减1 
{
    sum = sum - 1;
}
void sudoku::setval_sum(int num)//将该空格可能的数值填入val数组中 ;num为数独阶数  
{
    int i, j = 0;
    for (i = 1; i <= num; i++)
    {
        if (a[i] == 0)
        {
            val[j] = i;
            j++;
        }
    }
    sum = j - 1;
}
//获取数据成员
int sudoku::getval(int t)
{
    return val[t];
}
int sudoku::getsum()
{
    return sum;
}
int sudoku::getcol()
{
    return col;
}
int sudoku::getrow()
{
    return row;
}

2.機能チェックで数字をチェック

//遍历该空格所在行、列、宫中出现的数
//su是全局变量,一个二维数组,用来存放数独盘面。
void cheak(int r,int c,int num)//r是所在行号,c是所在列号,num是数独盘面的阶数
{
    int i,j,x,y;
    for(i=0;i<10;i++)//a数组中存放下标所示数字在行、列、宫中出现的次数;每对一个空格查看出现过的数,需要对数组重置为0
    {
        a[i]=0;
    }
    for(i=0;i<num;i++)//查看所在行出现的数 
    {
        if(su[r][i]!=0)
        a[su[r][i]]=a[su[r][i]]+1;
    } 
    for(i=0;i<num;i++)//查看所在列出现的数 
    {
        if(su[i][c]!=0)
        a[su[i][c]]=a[su[i][c]]+1;
    } 
//查看所在宫出现的数
//x,y是用来标识空格所在宫的位置
    if(num==4) 
    {
        x=r/2;
        y=c/2;  
        for(i=x*2;i<=(x*2+1);i++)
        {
            for(j=y*2;j<=(y*2+1);j++)
            {
                if(su[i][j]!=0)
                a[su[i][j]]=a[su[i][j]]+1;
            }
        }
    } 
    else if(num==6)
    {
        x=r/2;
        y=c/3;  
        for(i=x*2;i<=(x*2+1);i++)
        {
            for(j=y*3;j<=(y*3+2);j++)
            {
                if(su[i][j]!=0)
                a[su[i][j]]=a[su[i][j]]+1;
            }
        }       
    }
    else if(num==8)
    {
        x=r/4;
        y=c/2;  
        for(i=x*4;i<=(x*4+3);i++)
        {
            for(j=y*2;j<=(y*2+1);j++)
            {
                if(su[i][j]!=0)
                a[su[i][j]]=a[su[i][j]]+1;
            }
        }       
    }
    else if(num==9)
    {
        x=r/3;
        y=c/3;  
        for(i=x*3;i<=(x*3+2);i++)
        {
            for(j=y*3;j<=(y*3+2);j++)
            {
                if(su[i][j]!=0)
                a[su[i][j]]=a[su[i][j]]+1;
            }
        }       
    }
 } 



デジタル思考の宮殿のクエリが発生した場合はスペースの宮殿の場所が配置されているかを決定し、最初のグリッド宮殿から探し始めると表示された番号に注意することです。グリッド仕様を分割することによって宮殿は、そのような宮殿グリッドとして商得スケールグリッドを、乗算空間の第1グリッド位置は、x = R / 2、Y =であり ; C / 3 スペースここで最初の家グリッド位置2 X ,. 3オーダー家のY、他の同様の動作。以下では、

3.塗りつぶし機能再び次の可能な値

int back(int t)//重置该空格的值 
{
    if(s[t].getsum()>=0)//判断该空格是否还有其他未填入可能数字。若有,填入该值且该空格可能数字个数减1;若无,将本格中数字置0,继续调用back函数回到上一个空格。
    {
        su[s[t].getrow()][s[t].getcol()]=s[t].getval(s[t].getsum());
        s[t].setsum(); 
    } 
    else
    {
        su[s[t].getrow()][s[t].getcol()]=0;
        t=back(t-1);
    }
    return t;
}

業績

授業のアシスタントを使用すると、以下の結果を入力し、ネットワーク上で自分自身を見つけるために数独数独のディスクとディスクを収集しました:

性能解析

心理と収穫

  この個人的なプログラミングの仕事の後、私は多くのことを学びました。main関数に渡されるコマンドラインパラメータを学び、私はファイル操作を読むことを学んだ、GitHubの上のファイルをアップロードすることを学んだ......今、彼はまだ多くのことを学ぶ必要がありますが、また努力はすることができます。さあ!

おすすめ

転載: www.cnblogs.com/address2019/p/11567164.html