主题: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;
}
//////////////////////////////////////////////////////////////////////////////
//
// 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;
}