1

ここに画像の説明を入力

ここに画像の説明を入力

これは、この質問に対する私のコードです:

#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

#define N 10

int main()
{
int i,move,move_count,row,col;
char ch = 'A',a[N][N];

for(row = 0; row < N; row++)
   for(col = 0; col < N; col++)
      a[row][col] = '.';

srand(time(NULL));
row = rand()%10;
col = rand()%10;
a[row][col] = ch;

for(i = 0; i < 26; i++)
{
    move = rand() % 4;
    move_count = 0;
    if(move == 0 && move_count < 4)                   //down
    {
        if(row+1 < 10 && a[row+1][col] == '.')
        {
           ch = ch + 1;    
           a[row+1][col] = ch;
           row += 1; 
        }
        else 
        {
           move = 2; 
           move_count++;
        }
    }

    if(move == 2 && move_count < 4)              //up
    {
        if(row-1 > 0 && a[row - 1][col] == '.')
        {
            ch = ch + 1; 
            a[row-1][col] = ch;
            row -= 1;
        }
        else 
        {
           move = 1; 
           move_count++;
        }
    }

    if(move == 1 && move_count < 4)             //left
    {
        if(col-1 > 0 && a[row][col-1] =='.')
        {
            ch = ch + 1; 
            a[row][col-1] = ch;
            col -= 1;
        }
        else 
        {
           move = 3; 
           move_count++;
        }
    }

    if(move == 3 && move_count < 4)             //right
    {
        if(col+1 < 10 && a[row][col+1] == '.')
        {
            ch = ch + 1; 
            a[row][col+1] = ch;
            col += 1;
        }
        else 
        {
           move = 0; 
           move_count++;
        }
    }
    if(move_count == 4)
    break;

}

for(row = 0; row < N; row++)
{
    for(col = 0; col < N; col++)
       printf("%c",a[row][col]);
    printf("\n");
}                                  
getch();
}

実行時に、条件に違反することなく途中で終了することがあり(b)ます。
o/p ここに画像の説明を入力

最初の o/p では で終了しV、2 番目では で終了することが簡単にわかりますYが、どちらの場合もさらに移動することができます。これから取り除く方法はありますか?

EDITED
私の果てしない努力の後、私はこのコードを修正しました(そして、内部ループを使用せずにそうです!) アドバイスをくれたThomas Padron-McCarthy&に感謝します。 編集されたコード: Ilmari Karonen

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define N 10

int main()
{
int i,move,move_count,row,col,seed=4;
char ch = 'A',a[N][N];

for(row = 0; row < N; row++)
   for(col = 0; col < N; col++)
      a[row][col] = '.';

srand((unsigned)seed);
//srand(time(NULL));
row = 0;//rand()%10;
col = 0;//rand()%10;
a[row][col] = ch;

for(i = 0; i < 26;)
{
    move = rand() % 4;

    if(move == 0)                                   //down
    {
        if(row+1 < N && a[row+1][col] == '.')
        {

           a[++row][col] = ++ch;
           i++;
        }

    }

    else if(move == 2)                              //up
    {
        if(row-1 >= 0 && a[row - 1][col] == '.')
        {
            a[--row][col] = ++ch;
            i++;
        }

    }

    else if(move == 1)                              //left
    {
        if(col-1 >= 0 && a[row][col-1] =='.')
        {
            a[row][--col] = ++ch;
            i++;
        }

    }

    else if(move == 3)                              //right
    {
        if(col+1 < N && a[row][col+1] == '.')
        {
            a[row][++col] = ++ch;
            i++;
        }

    }
    if((a[row+1][col]!='.'||row==9) && (a[row - 1][col]!='.'||row==0) && 
        (a[row][col-1]!='.'||col==0 )&& (a[row][col+1]!='.'||col==9) || i==25)
        break;        

}

for(row = 0; row < N; row++)
{
    for(col = 0; col < N; col++)
       printf("%c ",a[row][col]);
    printf("\n");
}                                  
return 0;

}

4

3 に答える 3

3

for(i = 0; i < 26; i++)内部ループはありません。

これは、26回の移動ではなく、 26 回の試行を行うことを意味します。

ランダムな方向に移動しようとし、4 つの方向すべてがチェックされた場合にのみ終了する内部ループが必要です。

注: 試行回数のカウント ( move_count) はrand、同じ方向を複数回指定できるため、機能しません。

于 2013-06-20T16:04:19.353 に答える
1

問題は、元の方向がブロックされている場合に移動方向をインクリメントしていることですが、インクリメント プロセスは 3 までしか進みません。その後、0 にラップアラウンドしません。したがって、たとえば、選択した元のランダムな方向が 2 で、方向 2 と 3 の両方がブロックされている場合、方向 0 と 1 を試すことはありません。

2つの明白な解決策(数値的に最初のブロックされていない方向に偏っている方法とは異なり、有効な方向の均一にランダムな選択も保証します)は、次のいずれかです。

  • 最初に少なくとも 1 つの有効な移動方向があることを確認し、そうであれば、有効な方向が見つかるまで無期限にランダムな方向を選択し続けるか、または

  • 最初にすべての有効な移動方向のリストを作成し、そこからランダムな要素を選択します。

2 番目の方法は、実装が少し複雑ですが (それほど多くはありません)、少なくとも多くの隣接する正方形が既に塗りつぶされている場合には、より高速になるはずです。

于 2013-06-20T16:09:11.377 に答える
1
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

#define N 10

int main(void){
    int i, row, col;
    char ch = 'A',a[N][N];

    for(row = 0; row < N; row++)
        for(col = 0; col < N; col++)
            a[row][col] = '.';

    srand(time(NULL));
    row = rand()%10;
    col = rand()%10;
    a[row][col] = ch;

    for(i = 1; i < 26; i++){//already put 'A'
        enum { down, left, up, right };//0,1,2,3
        int move[] = {0,1,2,3};//Candidate in the moving direction
        int move_count, n;
        n = rand() % 4;//start direction
        move_count = 0;

        while(move_count<4){
            int gone = 0;
            n = (n + move_count) % 4;
            switch(move[n]){
            case  down:
                if(row+1 < 10 && a[row+1][col] == '.'){
                    a[++row][col] = ++ch;
                    gone = 1;//I was able to go forward.
                }
                break;
            case up:
                if(row-1 > 0 && a[row - 1][col] == '.'){
                    a[--row][col] = ++ch;
                    gone = 1;
                }
                break;
            case left:
                if(col-1 > 0 && a[row][col-1] =='.'){
                    a[row][--col] = ++ch;
                    gone = 1;
                }
                break;
            case right:
                if(col+1 < 10 && a[row][col+1] == '.'){
                    a[row][++col] = ++ch;
                    gone = 1;
                }
                break;
            }
            if(gone) break;
            ++move_count;//Number of times that I tried for a destination
        }
        if(move_count == 4){
            printf("No longer able to move\n");//need backtrack
            break;//give up!
        }
    }

    for(row = 0; row < N; row++){
        for(col = 0; col < N; col++)
            printf("%c",a[row][col]);
        printf("\n");
    }
    return 0;
}
于 2013-06-20T19:33:45.357 に答える