當前位置:首頁 » 編程語言 » c語言解決拉丁方陣問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言解決拉丁方陣問題

發布時間: 2022-06-05 16:51:20

⑴ c++最小拉丁方陣

#include<iostream>
usingnamespacestd;
#defineN6
intmain()
{
inti,j;
for(i=1;i<=N;i++)
{
for(j=i;j<N+i;j++)
cout<<(j-1)%N+1<<"";
cout<<endl;;
}
return0;
}

⑵ C語言編程題「幸運方陣」問題怎麼解決

嘛啊!我走人吧!我還是初級的呢!學了不到1個月,C語言就解決了。。。。。。。。。。

⑶ Turbo Pascal編程高手們,這道題咋編(拉丁方陣)

二維數組啊

⑷ 構造一個3*3的拉丁方陣,使該矩陣中的每行每列中數字1,2,3都只出現一次。30分不成敬意。

/*
來自n個部隊的n種軍銜的n×n名軍官,
如果能排成一個正方形,每一行,每一列的n名軍官來自不同的部隊並且軍銜各不相同,
那麼就稱這個方陣叫正交拉丁方陣。
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
分配 rowSize * colSize 的二維數組空間
*/
int ** mallocTwoDimensionArray(int rowSize,int colSize)
{
int **array = (int**)malloc(sizeof(int*)*rowSize);
int i,j;
if(array == NULL)
{
return NULL;
}
else
{
for(i=0;i<rowSize;i++)
{
array[i] = (int*)malloc(sizeof(int)*colSize);
if(array[i] == NULL)
{
for(j=0;j<i;j++)
{
free(array[j]);
}
return NULL;
}
else
{
memset(array[i],0,colSize*sizeof(int));
}
}
return array;
}
}
struct LatinSquare
{
int size;
int **square;
LatinSquare * next;
};
/*
保存大小為 size * size 大小的拉丁方陣 square
到鏈表 head 中

返回:是否成功保存到鏈表中
*/
int saveLatinSquare(struct LatinSquare *head,int size,int** square)
{
struct LatinSquare *p;
int i,j;

p = (struct LatinSquare *)malloc(sizeof(struct LatinSquare));
if(p == NULL)
{
return 0;
}
else
{
// 拉丁矩陣大小
p->size = size;

p->square = mallocTwoDimensionArray(size,size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++)
{
p->square[i][j] = square[i][j];
}
}

// 添加構造好的拉丁矩陣到鏈表中
p->next = head->next;
head->next = p;

return 1;

}

}
/*
輸出拉丁矩陣
*/
void printLatinSquare(struct LatinSquare *p)
{
int i,j;
if(p == NULL)
{
return ;
}
else
{
for(i=0;i<p->size;i++)
{
for(j=0;j<p->size;j++)
{
printf("%d ",p->square[i][j]);
}
printf("\n");
}
printf("\n");
}
}

/*
構造大小為 size * size 大小的拉丁方陣
構造結果通過鏈表 head 返回
square : 當前正在構造的拉丁方陣
row : 當前正在構造的拉丁方陣的行號
col : 當前正在構造的拉丁方陣的列號
generatedSquareNum : 已經構造好的拉丁方陣數

返回:
能構造出的拉丁反正種數
*/
void generateLatinSquare(int size,struct LatinSquare *head,int *totalSquareNum ,int**square,int row,int col)
{
int i,j,k;
int *isNumberUsed = (int*)malloc(sizeof(int)*(size+1));

if(row == size)
{
/*
保存構造好的拉丁矩陣到結構體中。
對於構造種數比較小的拉丁矩陣適用。

構造種數比較多的,不要保存,內存會不夠。
*/
saveLatinSquare(head,size,square);

/*
構造種數加一
*/
(*totalSquareNum) ++;

/*
輸出構造好的拉丁矩陣到屏幕。

根據需要可以關閉這里的輸出(構造種數比較少的,結果直接通過鏈表返回)
*/
printf("第 %d 個大小為 %d 的拉丁方陣:\n",*totalSquareNum,size);
printLatinSquare(head->next);
}
else
{
if(square == NULL)
{
square = mallocTwoDimensionArray(size,size);
}

memset(isNumberUsed,0,sizeof(int)*(size+1));

// 所在列上已經使用過的數字
for(i=0;i<row;i++)
{
isNumberUsed[square[i][col]]=1;
}
// 所在行上已經使用過的數字
for(j=0;j<col;j++)
{
isNumberUsed[square[row][j]]=1;
}

// 枚舉沒有被使用過的數字
for(k=1;k<=size;k++)
{
if(!isNumberUsed[k])
{
square[row][col] = k;
// 遞歸構造下一位上的數字
generateLatinSquare(size,head,totalSquareNum,square,row+(col+1)/size,(col+1)%size);
}
}

free(isNumberUsed);
}

}
int main(int argc, char *argv[])
{
int i,j,k;
int size,totalSquareNum;
struct LatinSquare head ,*p;
head.next = NULL;

// 構造大小從 3 ~ 10 的拉丁方陣
for(size = 3;size <=6;size ++)
{
head.next = NULL;
totalSquareNum = 0;

generateLatinSquare(size,&head,&totalSquareNum,NULL,0,0);
printf("大小為 %d 的拉丁方陣一共能構造 %d 個。\n\n",size,totalSquareNum);
/*
for(k=0,p=head.next;p!=NULL;p=p->next,k++)
{
printf("第 %d 個大小為 %d 的拉丁方陣:\n",k,size);

for(i=0;i<p->size;i++)
{
for(j=0;j<p->size;j++)
{
printf("%d ",p->square[i][j]);
}
printf("\n");
}
printf("\n");
}
*/
}
return 0;
}

⑸ 拉丁方陣的C語言實例 拉丁方陣

構造 NXN 階的拉丁方陣(2<=N<=9),使方陣中的每一行和每一列中數字1到N只出現一次。如N=4時:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
*問題分析與演算法設計
構造拉丁方陣的方法很多,這里給出最簡單的一種方法。觀察給出的例子,可以發現:若將每 一行中第一列的數字和最後一列的數字連起來構成一個環,則該環正好是由1到N順序構成;對於第i行,這個環的開始數字為i。按照 此規律可以很容易的寫出程序。下面給出構造6階拉丁方陣的程序。
*程序說明與注釋
#include<stdio.h>
#define N 6 /*確定N值*/
int main()
{
int i,j,k,t;
printf("The possble Latin Squares of order %d are: ",N);
for(j=0;j<N;j++) /*構造N個不同的拉丁方陣*/
{
for(i=0;i<N;i++)
{
t=(i+j)%N; /*確定該拉丁方陣第i 行的第一個元素的值*/
for(k=0;k<N;k++) /*按照環的形式輸出該行中的各個元素*/
printf("%d",(k+t)%N+1);
printf(" ");
}
printf(" ");
}
}
*運行結果
The possble Latin Squares of order 6 are:
1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2
2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3
3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4
4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5
5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6
6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1
4 5 6 1 2 3 5 6 1 2 3 4 6 1 2 3 4 5
5 6 1 2 3 4 6 1 2 3 4 5 1 2 3 4 5 6
6 1 2 3 4 5 1 2 3 4 5 6 2 3 4 5 6 1
1 2 3 4 5 6 2 3 4 5 6 1 3 4 5 6 1 2
2 3 4 5 6 1 3 4 5 6 1 2 4 5 6 1 2 3
3 4 5 6 1 2 4 5 6 1 2 3 5 6 1 2 3 4

⑹ 拉丁方陣的如何判斷拉丁方陣

拉丁方陣是一種n×n的方陣,方陣中恰有n種不同的元素,每種元素恰有n個,並且每種元素在一行和一列中 恰好出現一次。著名數學家和物理學家歐拉使用拉丁字母來作為拉丁方陣里元素的符號,拉丁方陣因此而得名。例如下圖是一個3×3的拉丁方陣:
3 2 1
2 1 3
1 3 2
如果一個拉丁方陣的第一行和第一列按照元素的先後順序來排列,那麼這稱為拉丁方陣的標准型,例如下 圖就是一個3x3的拉丁方陣標准型,第一行和第一列都是」1 2 3」。
1 2 3
2 3 1
3 1 2
【C語言】
//t=0時,不是拉丁方陣
//t=1時,是拉丁方陣
//t=2時,是標准型拉丁方陣
#include<stdio.h>
#include<string.h>
int a[101][101],b[101][101],c[101][101];
#define clr(x) memset(x,0,sizeof(x))
int main()
{
int n,i,j,k,t;
while(scanf("%d",&n)&&n)
{
t=1;k=1;
clr(a);clr(b);clr(c);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
b[i][a[i][j]]++;
c[a[i][j]][j]++;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(b[i][j]!=1||c[i][j]!=1)
{t=0;break;}
}
/*判斷是否是標准型*/
if(t){
for(i=1;i<=n;i++)
if(a[1][i]!=i||a[i][1]!=i)
{k=0;break;}
if(k)t=2;
}
printf("%d ",t);
}
}