1. 程式人生 > >【C語言】輸出N階拉丁方陣並統計個數

【C語言】輸出N階拉丁方陣並統計個數

題目如下:

在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> 
#define maxorder 5
int array[maxorder][maxorder]; //定義最大階數為5階方陣 
int count,num;   //定義全域性計數變數num 

int make(int x,int y,int N);
int judge(int x,int y);
void print();

int make(int x,int y,int N)  //產生每個矩陣並計數 
{ 
  if(count==N*N)     
  { 
  print(N);          //如果數字產生完畢,輸出矩陣,並計入計數器 
  num++; 
  } 
  else
  { 
     for(int i=1;i<=N;++i){     //產生矩陣數字 
     array[x][y]=i; 
     count++; 
       if(judge(x,y)){ 
       int yy=(y+1)%N; 
       int xx=x; 
       if(y==N-1) xx=x+1; 
       make(xx,yy,N); 
       } 
     --count;                   //遞迴完畢重新生成矩陣 
     } 
  }  
} 


int judge(int x,int y)         //檢查元素是否在一行或一列中重複出現,是返回0,否返回1 
{ 
int i; 
int judgenum=array[x][y]; 
for( i=0;i <y;i++) 
if(judgenum==array[x][i]) return 0; 
for(i=0;i <x;i++) 
if(judgenum==array[i][y]) return 0; 
return 1; 
} 


void print(int N)             //列印矩陣 
{  
   for(int i=0;i <N;i++){ 
   for(int j=0;j <N;j++) 
   printf( "%2d ",array[i][j]); 
   printf( "\n "); 
   } 
   printf( "\n "); 
} 


int main(){      //主函式 
int N;
printf( "請輸入矩陣的階數: "); 
scanf( "%d",&N); 
printf( "\n ");
make(0,0,N);
printf( "%d階拉丁方陣有%d個\n ",N,num); 
return 0;
} 






相關推薦

C語言輸出N拉丁方陣統計個數

題目如下: 在N行N列的數陣中, 數K(1〈=K〈=N)在每行和每列中出現且僅  出現一次,這樣的數陣叫N階拉丁方陣。例如下圖就是一個五階拉丁方陣。  編一程式,從鍵盤輸入N值後,打印出所有不同的N階拉丁方陣,並統計個數。         1  2  3  4  5    

C語言N

求N的階乘  //輸入一個數 n ,求n! #include "stdio.h" int main(){ int n,i; double l = 1; //提高精度 printf("Enter N:"); scanf("%d",&n); for(i = n; i

C語言輸出“*”菱形圖案

  問題:在螢幕上輸出一個菱形圖案   目標圖案:      實現思路:   由目標圖案可知:該圖案共有13行,每行除了有“*”外,第一個“*”之前還包括空格。我們可以把整個圖案分為上7行和下6行來看。上7行中,空格的個數隨行數增加而減少1,“*”的個數

c語言輸出以下4*5的矩陣

// 輸出以下4*5的矩陣 // 1 2 3 4 5 // 2 4 6 8 10 // 3 6 9 12 15 // 4 8 12 16 20 #include <stdio.h> int main() { int i,j,k,l; for( i = 1

C語言輸出100~999之間的所有“水仙花數”

  “水仙花數”:   “水仙花數”又稱為“阿姆斯特朗數”。如果一個n(n≥3)位數的各位數字的n次冪之和等於該數本身,則該數稱為“水仙花數”。如:153=1³+5³+3³。   問題:輸出100~999之間的所有“水仙花數”。   實現思路:   根據

C語言輸出菱形星號圖案

#include<stdio.h> int main() {  int i,j,k;  for(i=0;i<=6;i++)  {  for(j=0;j<=5-i;j++)

c語言輸出一個圖形

/* 輸出 ********** very good! ********** */ #include <stdio.h> int main() { int i; for( i = 0; i < 10; i++) { print

C語言輸出好看的星星圖形

想要輸出下面的星星圖案       *      ***     *****    *******   *********  *********** *************  **********

c語言輸出平行四邊形圖案

#include <stdio.h> int main() { char a[5]={'*','*','*','*','*'}; int i,j,k; char space=' '; for(i=0;i<5;i++) { printf("\n

c語言分別輸出1!和n!的值(要求使用靜態變數)

#include<stdio.h> /* 需求:編寫程式分別輸出1!到n!(要求使用靜態變數) 分析:使用一個函式定義一個靜態變數,用來存放每次呼叫完成之後 階乘的數 例如: f(1) = 1 f(2) = 2 f(3) = 3 在f(2)的基礎上直接 3*2 返回6 就可以獲得該

C語言簡單的瞭解遞迴(求斐波那契,n乘,字串長度,把一個整型(無符號),轉化為字元型打印出來)

簡單瞭解遞迴1.什麼是遞迴???程式設計程式呼叫自身的程式設計技巧稱為遞迴( recursion)遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接 或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的 規模較小的問

C語言推斷一個數是否為2的n次方

post data- popu scanf scan ng- 輸入 ont print //推斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))

C語言利用迴圈輸出菱形

輸出菱形的思想主要是用了等差數列 an = a1 + (n - 1) * d  來求每個迴圈的約束條件; 一個完整的菱形必須是由空格 、星形 來組成,切分為兩部分。   題目效果如下: //要求輸出如下圖形 *   ***  *

C語言輸入一個整數N,求N以內的素數之和

【C語言】輸入一個整數N,求N以內的素數之和   /* ============================================================================ Name

C語言實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)的置0或者置1操作,保持其他位不變

請編碼實現以下功能的函式 功能:實現對一個8bit資料(unsigned char 型別)的指定位(例如第n位)的置0或者置1操作,並保持其他位不變。 函式原型:void bit_set(unsigned char *p_data,unsigned char position,int flag)

c語言從字串str中擷取一個子串,要求子串是從str的第m個字元開始 由n個字元組成

#include<stdio.h> #include<string.h> /* 編寫程式:從字串str中擷取一個子串,要求子串是從str的第m個字元開始 由n個字元組成 程式理解: 需求中要求的是從一個字串中擷取固定的長度 m---->是開始的個數 n---->是

c語言用迴圈結構輸出下列數字金字塔

  #include<stdio.h> void main(){ int i,j,k; for(i=1;i<=10;i++){ for(j=10;j>i;j--) printf(" "); for(k=1;k<=(2*i-1)/2

C語言對一個n*n矩陣,通過行變換,使其每行元素的平均值按遞增順序排序

#include<stdio.h> int main() { int n,a[100][100],r,c,i,j; scanf("%d",&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&am

C語言求1-N的和(遞迴法)

遞迴公式: 條件:f(1) = 1 遞迴條件:f(n-1) + n 為了手機顯示方便(配圖): 程式碼為: //求1-N的和 #include "stdio.h" int f(int n) { //定義函式f 出口為n等於1,否則將n與f(n-1)相

C語言用結構體陣列指標完成:有三個學生資訊,存放在結構體陣列中,要求輸出全部資訊

//用結構體陣列指標完成:有三個學生資訊,存放在結構體陣列中,要求輸出全部資訊 #include <stdio.h> struct Stu { int num; char name[2