gpt4 book ai didi

c - "Random Walk"程序提前终止

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:52 24 4
gpt4 key购买 nike

enter image description here

enter image description here

这是我对这个问题的代码:

#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 enter image description here

在第一个 o/p 中可以很容易地看到,它在 V 处终止,而在第二个中它在 Y 处终止,尽管在这两种情况下都可以进一步移动。知道如何摆脱这个吗?

已编辑
经过我不懈的努力,我已经更正了这段代码(是的,没有使用内部循环!)。感谢 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;

}

最佳答案

你有 for(i = 0; i < 26; i++)没有内部循环。

这意味着您将有 26 次尝试,而不是 26 次移动

您需要一个内部循环,它将尝试朝随机方向前进,并且只有在检查了所有 4 个方向后才会退出。

注意:计算尝试次数 ( move_count ) 是行不通的,因为 rand可以多次给你同一个方向。

关于c - "Random Walk"程序提前终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17218105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com