大家帮我看看错在哪了,该怎么改进(刚才问题描述不清楚请原谅)

时间:2023-02-22 14:49:05
题目是这样的:
  编写程序,要求此程序可以产生一种贯穿 10X10 数组的“随机步”。数组将包含字符(初始时所有数组元素为字符'.')。程序必须从一个元素随机“走到”另一个元素,对一个元素来说这种走始终向上、向下、向左、向右。程序访问到的元素将用从A到Z的字母进行标记,而且是按顺序进行的访问。
下面是期望输出的一个示例:
A . . . . . . . . .
B C D . . . . . . .
. F E . . . . . . .
H G . . . . . . . .
I . . . . . . . . .
J . . . . . . . Z .  
K . . R S T U V Y .
L M P Q . . . W X .
. N O . . . . . . .
. . . . . . . . . .
提示: 利用 srand函数 和 rand 函数 产生随机数。在产生随机数后,查看此数除以4的余数。余数一共有4种可能的值:0、1、2和3,这些数字分别说明了下一步移动的方向。在此移动之前需要检查两项内容: 一是不能超出数组的范围,二是不要选取已经标记吧字母的元素。如果这两个条件都不满足,尝试换个方向移动。如果全部锁定了下一步的4个方向,那么程序就必须终止了。
下面是提前结束的一个示例:
A B G H I . . . . .
. C F . J K . . . .
. D E . M L . . . .
. . . . N O . . . .  
. . W X Y P Q . . .
. . V U T S R . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .

因为Y的四边都已经锁定,所以没有地方可以放置下一步的Z了。

7 个解决方案

#1


#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define NUM_ROW 10
#define NUM_COLUMN 10
#define TRUE 1
#define FALSE 0

typedef int Bool;

main ()
{
unsigned char ch_i[NUM_ROW][NUM_COLUMN];  /*数据数组*/
Bool test[NUM_ROW][NUM_COLUMN] = {0};/*判断数组*/
int n, i, j;
unsigned char m = 'A';

for(i=0; i<NUM_ROW ; i++)  /*循环对数组写入'.' */
{
for(j=0; j<NUM_COLUMN ; j++)
ch_i[i][j] ='.';
}

srand ((unsigned) time(NULL));/*生成伪随即种子*/
ch_i[0][0] = m;
m++;
i=0, j=0;

while (m <= 'Z')
{

n = ( rand() % 4 ) % 4;/*生成随即数*/

if(n==0&&i==0)           /*这里设定的0为向上;1为向下;2为向左;3为乡下*/
continue;
else if(n==1&&i==NUM_ROW-1) /*判定数组的边界*/
continue;
else if(n==2&&j==0)
continue;
else if(n==3&&j==NUM_COLUMN-1)
continue;

switch(n)             
{
case 0: i--; break;
case 1: i++; break;
case 2: j--; break;
case 3: j++; break;
}
if(test[i][j]==FALSE)
{
ch_i[i][j] = m;
test[i][j] = TRUE;
m++;
}

if(i!=0&&i!=NUM_ROW-1&&j!=0&&j!=NUM_COLUMN-1)/*判断四周是否还有位置可以走*/
{
if(test[i+1][j]==TRUE&&test[i-1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==0&&j!=0&&j!=NUM_COLUMN-1)
{
if(test[i+1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j!=0&&j!=NUM_COLUMN-1)
{
if(test[i-1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1])
break;
}
else if(j==0&&i!=0&&i!=NUM_ROW-1)
{
if(test[i][j+1]==TRUE&&test[i+1][j]==TRUE&&test[i-1][j]==TRUE)
break;
}
else if(j==NUM_COLUMN-1&&i!=0&&i!=NUM_ROW-1)
{
if(test[i][j-1]==TRUE&&test[i+1][j]==TRUE&&test[i-1][j]==TRUE)
break;
}
else if(i==0&&j==NUM_COLUMN-1)
{
if(test[i+1][j]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j==0)
{
if(test[i-1][j]==TRUE&&test[i][j+1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j==NUM_COLUMN-1)
{
if(test[i-1][j]==TRUE&&test[i][j-1]==TRUE)
break;
}
}

for(i=0;i<NUM_ROW;i++);    /*循环输出数组*/
{
for(j=0;j<NUM_COLUMN;j++)
printf("%c",ch_i[i][j]);
printf("\n");
}
system("pause");

return 0;
}

							     

#2


lz啊,大意啊,第一个for循环后面多了一个分号:
	for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
{
for(j=0;j<NUM_COLUMN;j++)
printf("%c",ch_i[i][j]);
printf("\n");
}

#3


引用 2 楼 dizuo 的回复:
lz啊,大意啊,第一个for循环后面多了一个分号:

C/C++ code
    for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
    {
        for(j=0;j<NUM_COLUMN;j++)
            printf("%c",ch_i[i][j]);
        printf("\n");
    }


++

#4


引用 2 楼 dizuo 的回复:
lz啊,大意啊,第一个for循环后面多了一个分号:
C/C++ code
    for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
    {
        for(j=0;j<NUM_COLUMN;j++)
            printf("%c",ch_i[i][j]);
        printf("\n");
    }


谢谢,改了一下午的代码都没发现,忽忽。
不过我感觉这里面有一些垃圾代码在里面,可惜水平有限,也只能写成这样了。哎
哪位大哥大姐帮忙看看,该怎么精简。

#5


菜鸟今天写的    求指教  正好做到这题

#include<stdio.h> 

#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N][N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}

#6


[code=#include]<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N[N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
} ][/code]

#7



#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N][N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}

#1


#include "stdio.h"
#include "stdlib.h"
#include "time.h"

#define NUM_ROW 10
#define NUM_COLUMN 10
#define TRUE 1
#define FALSE 0

typedef int Bool;

main ()
{
unsigned char ch_i[NUM_ROW][NUM_COLUMN];  /*数据数组*/
Bool test[NUM_ROW][NUM_COLUMN] = {0};/*判断数组*/
int n, i, j;
unsigned char m = 'A';

for(i=0; i<NUM_ROW ; i++)  /*循环对数组写入'.' */
{
for(j=0; j<NUM_COLUMN ; j++)
ch_i[i][j] ='.';
}

srand ((unsigned) time(NULL));/*生成伪随即种子*/
ch_i[0][0] = m;
m++;
i=0, j=0;

while (m <= 'Z')
{

n = ( rand() % 4 ) % 4;/*生成随即数*/

if(n==0&&i==0)           /*这里设定的0为向上;1为向下;2为向左;3为乡下*/
continue;
else if(n==1&&i==NUM_ROW-1) /*判定数组的边界*/
continue;
else if(n==2&&j==0)
continue;
else if(n==3&&j==NUM_COLUMN-1)
continue;

switch(n)             
{
case 0: i--; break;
case 1: i++; break;
case 2: j--; break;
case 3: j++; break;
}
if(test[i][j]==FALSE)
{
ch_i[i][j] = m;
test[i][j] = TRUE;
m++;
}

if(i!=0&&i!=NUM_ROW-1&&j!=0&&j!=NUM_COLUMN-1)/*判断四周是否还有位置可以走*/
{
if(test[i+1][j]==TRUE&&test[i-1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==0&&j!=0&&j!=NUM_COLUMN-1)
{
if(test[i+1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j!=0&&j!=NUM_COLUMN-1)
{
if(test[i-1][j]==TRUE&&test[i][j+1]==TRUE&&test[i][j-1])
break;
}
else if(j==0&&i!=0&&i!=NUM_ROW-1)
{
if(test[i][j+1]==TRUE&&test[i+1][j]==TRUE&&test[i-1][j]==TRUE)
break;
}
else if(j==NUM_COLUMN-1&&i!=0&&i!=NUM_ROW-1)
{
if(test[i][j-1]==TRUE&&test[i+1][j]==TRUE&&test[i-1][j]==TRUE)
break;
}
else if(i==0&&j==NUM_COLUMN-1)
{
if(test[i+1][j]==TRUE&&test[i][j-1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j==0)
{
if(test[i-1][j]==TRUE&&test[i][j+1]==TRUE)
break;
}
else if(i==NUM_ROW-1&&j==NUM_COLUMN-1)
{
if(test[i-1][j]==TRUE&&test[i][j-1]==TRUE)
break;
}
}

for(i=0;i<NUM_ROW;i++);    /*循环输出数组*/
{
for(j=0;j<NUM_COLUMN;j++)
printf("%c",ch_i[i][j]);
printf("\n");
}
system("pause");

return 0;
}

							     

#2


lz啊,大意啊,第一个for循环后面多了一个分号:
	for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
{
for(j=0;j<NUM_COLUMN;j++)
printf("%c",ch_i[i][j]);
printf("\n");
}

#3


引用 2 楼 dizuo 的回复:
lz啊,大意啊,第一个for循环后面多了一个分号:

C/C++ code
    for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
    {
        for(j=0;j<NUM_COLUMN;j++)
            printf("%c",ch_i[i][j]);
        printf("\n");
    }


++

#4


引用 2 楼 dizuo 的回复:
lz啊,大意啊,第一个for循环后面多了一个分号:
C/C++ code
    for(i=0;i<NUM_ROW;i++)  //去掉分号就正确了。。。
    {
        for(j=0;j<NUM_COLUMN;j++)
            printf("%c",ch_i[i][j]);
        printf("\n");
    }


谢谢,改了一下午的代码都没发现,忽忽。
不过我感觉这里面有一些垃圾代码在里面,可惜水平有限,也只能写成这样了。哎
哪位大哥大姐帮忙看看,该怎么精简。

#5


菜鸟今天写的    求指教  正好做到这题

#include<stdio.h> 

#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N][N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}

#6


[code=#include]<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N[N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}
} ][/code]

#7



#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 12

int main()
{
char a[N][N],c;
int i,j,t;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0 || i==N-1 || j==0 || j==N-1)
a[i][j]='0';
else
a[i][j]='.'; 
}
}
i=1;
j=1;
a[i][j]='A';
srand((unsigned)time(NULL));
while((a[i-1][j]=='.' || a[i+1][j]=='.' || a[i][j-1]=='.' || a[i][j+1]=='.') && a[i][j]<'Z' )
{
t=rand()%4;
c=a[i][j];
if (t==0 && a[i-1][j]=='.')
{
i--;
a[i][j]=c+1;
}
else if (t==1 && a[i+1][j]=='.')
{
i++;
a[i][j]=c+1;
}
else if (t==2 && a[i][j-1]=='.')
{
j--;
a[i][j]=c+1;
}
    else if (t==3 && a[i][j+1]=='.')
    {
     j++;
     a[i][j]=c+1;
     }
}
for(i=1;i<N-1;i++)
{
for(j=1;j<N-1;j++)
{
printf("%c ",a[i][j]);
}
printf("\n");
}