回 帖 发 新 帖 刷新版面

主题:gcc的第三题怎么都算不对,请大侠们帮我看一看到底是什么问题啊 !!!!

/*
//////////////////////////////////////////////////////////////////////////////
//
//  4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
//  出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
//  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。
//
//        1  2  3  4  5
//        2  3  4  5  1
//        3  4  5  1  2
//        4  5  1  2  3
//        5  1  2  3  4
//////////////////////////////////////////////////////////////////////////////

用递归实现的,但是每次都是在运行到一半的时候跳出,编译通过,结果不对。
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
#define N 5
int Num[N ][N ]={0};
int count=0;
int calculate(int row);
int JudgeRow(int row);
int JudgeTol( );
int Output ();int  main( )
{
    
    calculate(0);    
    printf("\n%d\n",count);
    getch();
    return 0;
}
int calculate(int row)
{
    int  col0,col1,col2,col3,col4;
for (col0=1;col0<=N;col0++)
      for(col1=1;col1<=N;col1++)
        { 
            for(col2=1;col2<=N;col2++)
            { 
                for(col3=1;col3<=N;col3++)
                { 
                    for(col4=1;col4<=N;col4++)
                    {    Num[row][0]=col0;
              Num[row][1]=col1;
                       Num[row][2]=col2;
                        Num[row][3]=col3;
                     Num[row][4]=col4;     
         if(!JudgeRow(row)) continue;
                          if(row==N-1 )
                  {       if( JudgeTol())
                           { Output();
                                  count++;
                        }
                               return 1;
                                        }
                                    else
                                    {
                        row++;
                                    calculate(row);}
    }}}}
                
    return 0;
}

int JudgeTol()
{
    int i,j,k ;
    for (i=0;i<N;i++)
        for (j=0;j<N;j++)
            for (k=j+1;k<N;k++)
                if (Num[k][i]==Num[j][i])
                    return 0;
     
    return 1;
}
int JudgeRow(int row)
{
    int i,j ;
    for(i=0;i<N;i++)
        for (j=i+1;j<N;j++)
            if (Num[row][i]==Num[row][j])
                return 0;
    return 1;

}
int Output()
{
    int i,j;
    for (i=0;i<N;i++)
    {
        for (j=0;j<N;j++)
        {
            printf("%3d",Num[i][j]);
        }
    printf("\n");
    }
    return 1;
}

回复列表 (共6个回复)

沙发

题目?代码注释?目前题目提交反馈?

板凳

这个递归看的好费劲

3 楼

for (col0=1;col0<=N;col0++)
      for(col1=1;col1<=N;col1++)
        { 
            for(col2=1;col2<=N;col2++)
            { 
                for(col3=1;col3<=N;col3++)
                { 
                    for(col4=1;col4<=N;col4++)
终值统统超界,应该<N不能=N,而相应地赋值应该+1

4 楼

谢谢!看了半天就是没看出来…

5 楼

有意义,有收获,谢谢提供

6 楼

[quote]for (col0=1;col0<=N;col0++)
      for(col1=1;col1<=N;col1++)
        { 
            for(col2=1;col2<=N;col2++)
            { 
                for(col3=1;col3<=N;col3++)
                { 
                    for(col4=1;col4<=N;col4++)
终值统统超界,应该<N不能=N,而相应地赋值应该+1[/quote]
他的初值为1的话,终值应该可以=N的吧,不然就少一次循环了

我来回复

您尚未登录,请登录后再回复。点此登录或注册