-2

したがって、基本的には、既存の配列を取得し、その配列内の3X3である特定の数値を移動して上下に移動するなどの支援が必要です。移動した後は、それに応じて値を移動する必要があります。例123321123

スポット(3、2)を左に移動したい123 213 123

また、上下の要素についても同じで、プログラムはあなたがいる場所に追いつき、それに応じてそれらを変更します

私のプログラムは座標も追跡する必要がありますが、実装方法はまだわかりません。

#include <iostream>
#include <iomanip>
#include <array>

using namespace std;

void printarray(int num[3][3])
{
    for(int i = 0;i < 3; i++)
    {
        for(int j = 0; j< 3; j++)
        {
            cout << num[i][j] << " ";
        }
        cout << "\n";
    }
}

void swapValues(int (&array)[3][3], int i1,int j1,int i2,int j2)
{
    int temp = array[i1][j1];
    array[i1][j1] = array[i2][j2];
    array[i2][j2] = temp;
}

void moveleft(int (&array)[3][3], int i, int j)
{
    if (i>0 && i<3 && j>=0 && j<3)
    {
        swapValues(array, i, j, i-1, j);
        swapValues(array, i, j, i+1, j);
    }
    else
    {
        cout << "wrong move!" << endl;
    }
    //swapValues(array, i, j, i, j-1);
    //swapValues(array, i, j, i, j+1);
}

void movedown(int (&array)[3][3], int i, int j)
{
    swapValues(array, i+1, j, i, j);
    swapValues(array, i-1, j, i, j);
}

void moveright(int (&array)[3][3], int i, int j)
{
    swapValues(array, i, j+1, i, j);
    swapValues(array, i, j-1, i, j);
}

void moveup(int (&array)[3][3], int i, int j)
{
    //here you MUST check the indexes to make sure you CAN move left
    //int lim = (3*3)-1;
    //for(int x = lim; x >= 1; x--)
    //{

    swapValues(array, i, j, i-1, j);
    swapValues(array, i, j, i+1, j);
    int coord1d = j * 3 + i;
}

class Puzzle
{
public:
    Puzzle();
    void swapValues(int num[3][3], int i1, int j1, int i2, int j2);
    //void moveleft(int[3][3], int start1, int start2);
    void moveup(int (&array)[3][3], int i, int j);
    void moveright(int (&array)[3][3], int i, int j);
    void moveleft(int (&array)[3][3], int i, int j);
    void movedown(int (&array)[3][3], int i, int j);
    void printarray(int[3][3]);
};

int main()
{
    int state1[3][3] = {{2, 8, 3}, {1, 6, 4}, {7, 0, 5}};
    int state2[3][3] = {{2, 8, 1}, {4, 6, 3}, {0, 7, 5}};
    int gstate[3][3] = {{1, 2, 3}, {8, 0, 4}, {7, 6, 5}};
    cout << "this is state 1" << endl;
    printarray(state1);
    cout << "\n\n";
    cout << "now this is state 2" << endl;
    printarray(state2);
    cout << "\n\n";
    cout << "now this is the goal state" << endl;;
    printarray(gstate);
    int start1, start2;
    cout << endl << endl << "please enter your starting point in the states listed above on the x axis(left to right)" << endl;
    cin >> start1;
    cout << "now enter the point on the y axis(up or down)" << endl;
    cin >> start2;
    //moveleft(state1, start1, start2);
    cout << "this is moving coordinate (1, 1) upwards" << endl;
    moveup(state1, start1, start2);
    printarray(state1);
    cout << endl;
    cout << "this is moving coordinate (1, 1) to the left" << endl;
    moveleft(state1, start1, start2);
    printarray(state1);
    cout << endl;
    cout << "this is moving coordinate (1, 1) downwards" << endl;
    movedown(state1, start1, start2);
    printarray(state1);
    cout << endl;
    cout << "this is moving coordinate (1, 1) to the right" << endl;
    moveright(state1, start1, start2);
    printarray(state1);
    cout << endl;

    cin.get();
    cin.get();
    return 0;
}

コード例を教えてください。説明は良いですが、私にとって十分に明確ではありません。あなたに答えを求めるのではなく、私が正しい答えを見るのを手伝ってください

  • コードを更新しましたが、ちょっとうまくいきました。唯一の問題は、(1、1)以外の座標を使用すると、配列番号ではなくメモリアドレスを取得することです。これについての説明は大歓迎です、私は問題がそこにさえどのようにあるのか本当にわからないので、私はこのような問題を修正する方法がわかりませんか?

また、そのコードは完全にコンパイル可能で準備ができているので、十分に説明しなかった場合の意味を確認するために実行してください。

4

1 に答える 1

0

これは可能な解決策です

この関数を使用して、特定のインデックスの値を交換します

void swapValues(int (&array)[3][3], int i1,int j1,int i2,int j2)
{
    int temp = array[i1][j1];
    array[i1][j1] = array[i2][j2];
    array[i2][j2] = temp;
}

次に、たとえば、あなたmoveLeftはこのようになります

void moveLeft(int (&array)[3][3], int i, int j)
{
    if (i>0 && i<3 && j>=0 && j<3)
    {
        swapValues(array, i, j, i-1, j);
    }
    else
    {
        cout << "wrong move!" << endl;
    }
}

配列を参照として渡すことに注意してください。そうしないと、変更がmain関数に表示されません。

于 2012-11-02T00:36:18.223 に答える