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

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

GitHubの住所:https://github.com/Yuqiancha919/061700232

PSPテーブル

PSP2.1 パーソナルソフトウェアプロセス段階 推定時間がかかる(分) 実際の時間がかかる(分)
プランニング 計画 120 120
推計 このタスクが必要とどのくらいの時間を見積もります 3600 7200
開発 開発 60 60
分析 (新しい技術を学ぶ含む)ニーズ分析 60 120
デザインスペック 設計ドキュメントの生成 30 30
デザインレビュー デザインレビュー 60 30
標準コーディング コードの仕様(現在の開発のための適切な規範の開発) 60 60
設計 具体的な設計 120 120
コーディング 具体的なコーディング 120 180
コードレビュー コードレビュー 120 120
テスト 検査(セルフテスト、コードを変更し、変更を提出) 120 180
報告 レポート 120 150
テストrepor テストレポート 30 60
サイズ測定 コンピューティングのワークロード 30 30
死後&プロセス改善計画 その後まとめ、およびプロセス改善計画 60 120
トータル 3600 9600

レビューのタイトル

数独は、各宮殿が9つの小さなセルに分割され、ディスク9つの宮殿です。デジタル知られており、論理および推論を使用して、この八十から一グリッドを解決する特定の条件を考えると、他の空間に番号1-9を入力します。1-9ので、各番号は、としても知られている各行、各列および各宮殿、一度だけ表示されていることを「正方形」。

今、私たちはJiugonggeに3つのグリッドからの高度な完全なステップバイステップで、行きたい、でも主要評価した後、他の事業者は、アップグレード、3つのグリッドのブログや他のタスクを完了すること。次のように詳細な各順序ルールは以下のとおりです。

三つのグリッド:ディスク3 3 1-3ので、各番号に関係なく宮殿の各行、各列に一度だけ表示されていること;
4つのグリッド:ディスク2
2 4パレス、すべての家に分割2個の四つの小細胞。1-4の各番号は、各行、各列および各宮殿に一度だけ表示され、
5つのグリッド:ディスク5
5 1-5ので、各番号は、各行に一度だけ表示されていること、各列は、関係なく、宮殿、
宮殿グリッド:ディスク2 3シックスPalaceは、各家は3個の分割された 2 6小細胞。1-6各数値は、各列および各宮殿、一度だけそれぞれの行に表示され、
7つの宮殿グリッド:ディスク7 7 1-7ので、各番号に関係なく宮殿の各行、各列に一度だけ表示されていること;
8つのグリッド:ディスク4
2 8家、すべての家に分け4個の8小細胞。各番号は一度だけ、各行、各列、各宮殿で1-8と表示されるように、
正方形を:ディスクが3である
3 9宮殿、すべての家は9つの小さな3x3のグリッドに分割されています。1-9ので、各番号は、各行、各列および各宮殿に一度だけ発生します。

考え

この質問は、ちょうど時間の感覚が困難で見始めて、その後数日を遅らせています。あなたが見つけたときの時間が長時間となっている、と私は座って、慎重に考えました。今、おそらく私はまだ私のアプローチに戻って考えて非常に良い感じ、行っています。
私の考えは、数字を埋めることができ、全体のxグリッドが一つずつ、3次元配列の定義をチェックした上でつまり、第1の2次元Xはディスクのグリッドを維持するために使用され、三次元がグリッドを維持するために使用され、非常に簡単です。それぞれのチェックのために、行と列だけでなく、数字が現れた小さなグリッドのこのグリッドをチェックし、それがマークされています。最後に、一つだけの数がグリッドを埋めるために、直接にマークされていないグリッドを確認してください。そして、上記の動作を繰り返します。グリッドが0でない場合は停止し、出力されます。
私は後で気づいた時には、問題を発見しました。データグリッドで満たされたいくつかの比較的小さな始まりのために、このアプローチは、おそらく完全な方法はありません。その後、私はインターネットを介して学習し、グリッドのすべての可能な数を試して、再帰的なアプローチを学び、あなたはには、正常に完了しようとすることができ、に戻りしようとする試みが失敗しました。

コードの実装

これは、達成するためのコードです。

void inti()
{
    int i, j, k;
    int cnt = 0;
    for (i = 1; i < N; i++)
        for (j = 1; j < N; j++)
        {
            if (sudu[i][j][0] == 0)
            {
                for (k = 1; k < N; k++)
                {
                    if (sudu[i][k][0] != 0)
                        sudu[i][j][sudu[i][k][0]] = 0;
                }
                for (k = 1; k < N; k++)
                {
                    if (sudu[k][j][0] != 0)
                        sudu[i][j][sudu[k][j][0]] = 0;
                }
                if (N == 5 || N == 7 || N == 9 || N == 10)
                {
                    if (N == 10)
                        ninesudu(i, j);
                    if (N == 9)
                        eightsudu(i, j);
                    if (N == 7)
                        sixsudu(i, j);
                    if (N == 5)
                        foursudu(i, j);
                }
                for (k = 1; k < N; k++)
                {
                    if (sudu[i][j][k] != 0)
                        cnt++;
                }
                if (cnt == 1)
                {
                    for (k = 1; k < 10; k++)
                    {
                        if (sudu[i][j][k] != 0)
                        {
                            sudu[i][j][0] = k;
                            break;
                        }
                    }
                }
            }
            cnt = 0;
        }
}

アカウントにすべてのグリッドを撮影

//九宫格 
void ninesudu(int i, int j)
{
    int m, n;
    if (i <= 3)
    {
        if (j <= 3)
        {
            for (m = 1; m < 4; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 1; m < 4; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 9)
        {
            for (m = 1; m < 4; m++)
                for (n = 7; n < 10; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 6)
    {
        if (j <= 3)
        {
            for (m = 4; m < 7; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 4; m < 7; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 9)
        {
            for (m = 4; m < 7; m++)
                for (n = 7; n < 10; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 9)
    {
        if (j <= 3)
        {
            for (m = 7; m < 10; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 7; m < 10; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 9)
        {
            for (m = 7; m < 10; m++)
                for (n = 7; n < 10; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
}


//八宫格 
void eightsudu(int i, int j)
{
    int m, n;
    if (i <= 4)
    {
        if (j <= 2)
        {
            for (m = 1; m < 5; m++)
                for (n = 1; n < 3; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 4)
        {
            for (m = 1; m < 5; m++)
                for (n = 3; n < 5; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 1; m < 5; m++)
                for (n = 5; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 8)
        {
            for (m = 1; m < 5; m++)
                for (n = 7; n < 9; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 8)
    {
        if (j <= 2)
        {
            for (m = 5; m < 9; m++)
                for (n = 1; n < 3; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 4)
        {
            for (m = 5; m < 9; m++)
                for (n = 3; n < 5; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 5; m < 9; m++)
                for (n = 5; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 8)
        {
            for (m = 5; m < 9; m++)
                for (n = 7; n < 9; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
}

//六宫格 
void sixsudu(int i, int j)
{
    int m, n;
    if (i <= 2)
    {
        if (j <= 3)
        {
            for (m = 1; m < 3; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 1; m < 3; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 4)
    {
        if (j <= 3)
        {
            for (m = 3; m < 5; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 3; m < 5; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 6)
    {
        if (j <= 3)
        {
            for (m = 5; m < 7; m++)
                for (n = 1; n < 4; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 6)
        {
            for (m = 5; m < 7; m++)
                for (n = 4; n < 7; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
}

//四宫格 
void foursudu(int i, int j)
{
    int m, n;
    if (i <= 2)
    {
        if (j <= 2)
        {
            for (m = 1; m < 3; m++)
                for (n = 1; n < 3; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 4)
        {
            for (m = 1; m < 3; m++)
                for (n = 3; n < 5; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
    else if (i <= 4)
    {
        if (j <= 2)
        {
            for (m = 3; m < 5; m++)
                for (n = 1; n < 3; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
        else if (j <= 4)
        {
            for (m = 3; m < 5; m++)
                for (n = 3; n < 5; n++)
                {
                    if (sudu[m][n][0] != 0)
                        sudu[i][j][sudu[m][n][0]] = 0;
                }
        }
    }
}

主な機能

int main(int argc, char *argv[])
{
    int i, n, j, k;
    int id = 0;
    ifstream ifp;
    ofstream ofp;
    N = atoi(argv[2]);
    N = N + 1;
    n = atoi(argv[4]);
    ifp.open(argv[6]);
    if (!ifp.is_open())//判断文件是否成功打开
        cout << "File open failed" << endl;
    ofp.open(argv[8]);
    if (!ofp.is_open())
        cout << "File open failed" << endl;
    int count = 0;
    while (n--)
    {
        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
                //cin >> sudu[i][j][0];
                ifp >> sudu[i][j][0];

        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
                for (k = 1; k < 10; k++)
                    sudu[i][j][k] = 1;
        inti();
        //cout << endl;
        ofp << endl;
        int q = 5;
        while (q--)
        {
            for (i = 1; i < N; i++)
            {
                for (j = 1; j < N; j++)
                    if (sudu[i][j][0] == 0)
                        inti();
            }
            for (i = 1; i < N; i++)
                for (j = 1; j < N; j++)
                    if (sudu[i][j][0] == 0)
                        count++;
            if (count == 0)
                break;
            count = 0;
        }

        for (i = 1; i < N; i++)
            for (j = 1; j < N; j++)
            {
                if (sudu[i][j][0] == 0)
                    id++;
            }
        if(id!=0)
            solve(id);
        for (i = 1; i < N; i++)
        {
            for (j = 1; j < N; j++)
            {
                //cout << sudu[i][j][0] << ' ';
                ofp << sudu[i][j][0] << ' ';
            }
            //cout << endl;
            ofp << endl;
        }
    }
    return 0;
}

その後改善が再帰を追加しました

void fill(int number, int i, int j) {
    for (int k = 1; k < N; k++) {
        sudu[i][k][number]++;
        sudu[k][j][number]++;
    }
    /*for (int n = 0; n < 3; n++) {
        for (int m = 0; m < 3; m++) {
            sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]++;
        }
    }*/
}
void  reset(int number, int i, int j) {
    for (int k = 1; k < N; k++) {
        sudu[i][k][number]--;
        sudu[k][j][number]--;
    }
    /*for (int n = 0; n < 3; n++) {
        for (int m = 0; m < 3; m++) {
            sudu[i / 3 * 3 + n][j / 3 * 3 + m][number]--;
        }
    }*/
}
void solve(int id)
{
    if (id == 0)
        return;
    for (int i = 1; i < N; i++)
    {
        for (int j = 1; j < N; j++)
        {
            if (sudu[i][j][0] == 0)
            {
                for (int number = 1; number < 10; number++)
                {
                    if (sudu[i][j][number] == 0)
                    {
                        number(number, i, j);
                        sudu[i][j][0] = number;
                        solve(id - 1);
                        sudu[i][j][0] = 0;
                        number(number, i, j);
er(number, i, j);
                    }
                }
                return;
            }
        }
    }
}

結果

ように!七十八グリッドは現在、小さな問題が解決するのは難しいですがあり...

性能解析

そして私は... 55(脂身を使用する方法を知って取得していない
、それはOKになります

概要

私はあまりにも料理した、555あまりにも困難であると言いたいです。
全体的に私は本当に私のために、新しいもの、学んだ学びました。私の心はまだ満足してい、私は確かにこの問題が出てきませんし、今ではおそらく大丈夫行われ、最初から戻って考えてみてください。しかし、私は特に私が現在時刻に数日のために恐れていたこの時のように、恐れてか、それを後で問題になることはありません、まだ十分な何かのあまりされていませんでした。
特定の給油後!

おすすめ

転載: www.cnblogs.com/spongebobyjh/p/11587486.html