永发信息网

C++问题

答案:2  悬赏:30  手机版
解决时间 2021-05-14 02:57

构造 NXN 阶的拉丁方阵(2<=N<=9),使方阵中的每一行和每一列中数字1到N只出现一次。如N=4时:

1 2 3 4

2 3 4 1

3 4 1 2

4 1 2 3

我这样写的

#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
void main()
{
srand(time(0));
int n,i,j,m;
cin>>n;
int **x;
x=new int* [n-1];
for(i=0;i<n;i++)
x[i]=new int[n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
x[i][j]=1+rand()%n;
for(m=0;m<n;m++)
{
if((x[i][j]==x[i][m]&&j!=m)||(x[i][j]==x[m][j]&&i!=m))
{
x[i][j]=1+rand()%n;
m=-1;
}
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<x[i][j]<<" ";
if(j==n-1)
cout<<endl;
}

}
}

为什么有时运行成功,有时不行?

最佳答案

我觉得有两个问题:


1、for(m=0;m<n;m++)——因为是m<n,你用x[i][j]和没有被初始化的元素进行比较


2、这种扔骰子的算法应该本来就不能保证一定会得出正确结果吧,你的程序可能在这里


for(m=0;m<n;m++)
{
if((x[i][j]==x[i][m]&&j!=m)||(x[i][j]==x[m][j]&&i!=m))
{
x[i][j]=1+rand()%n;
m=-1;
}
}
就陷入死循环了(x[i][i]有可能一直得不到满足条件的值,你可以试着打印x[i][j]看看),所以或者使用分支发来解决这一问题,或者设置条件判断死循环发生后初始化并重新开始投骰子的过程。

全部回答
x=new int* [n-1]; 这里为什么只分配n-1行?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么清理电脑内存更快更彻底?
王维是什么四杰
苏州哪里可以做义工,请问,上海宝山区周遭有没
箫和笛子哪个更好听,笛子什么调好听
江夏区湘味肥肠粉面哪位知道具体地址啊
合金弹头中蓝色的感叹号是什么
有关珍惜青春的名言,描写珍惜青春的句子
麻城市好又多日用百货地址在哪,我要去那里
有没有能让狗狗更快恢复体力的方法,除大力丸
老崔家烩面馆地址在哪,我要去那里办事
刺客穿什么好?具体的!越具体越好!
有什么偏方降虚火吗?
玩游戏就一定要冲钱吗????
小学作文十年后的我
宁乡市放心大药房怎么去啊,谁知道地址啊
推荐资讯
该怎样做?
怎么预防青春痘的方法,如何预防青春痘
EMS好慢啊
抓住机遇的名人名言,关于抓住机会的名言
永兴县圣象地板永兴分公司地址在什么地方,想
武广线时速394km/h,坐在车上啥感觉?有没有
描写窗帘的句子
刚下载实况10,怎么一到中场休息就黑屏?
海底有哪些生物?有多少种?
资兴市大兴汗蒸在哪里啊,我有事要去这里
珠晖区肯麦基(师院店)怎么去啊,谁知道地址啊
北京爱情故事精典台词,《北京爱情故事》吴狄
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?