#include <stdio.h>
#include <stdlib.h>
int count=0;
void print(int a[30][6])
{
count++;
printf("case: %d:\n",count);
for(int i=0;i<30;i++)
for(int j=0;j<6;j++)
{
printf("%d ",a[i][j]);
j==5?printf(" %d\n",i):0;
}
}
//判斷是否可以將第i行、第j列的數設為k
int test(int a[30][6],int i,int j,int k)
{
int p,q;
p=0;
while (p<6){
if(a[i][p]==k)return 0;
else ++p;
}
int num1=1,col=0;
while(col<j){
for(q=0;q<i;q++){
if((a[q][col]==a[i][col]&&a[q][j]==k)||(a[q][col]==k&&a[q][j]==a[i][col]))
++num1;
}
if(num1>2)return 0;
else {
col++;
num1=1;
}
}
return 1;
}
void SD(int a[30][6],int n)//求解
{
if(n==180){
print(a);
return ;
}
int i,j;
int b[30][6];
for(i=0;i<30;i++)
for(j=0;j<6;j++)
b[i][j]=a[i][j]; //用b進行嘗試
i=n/6,j=n%6; //行列
if(a[i][j]!=0){
SD(b,n+1);
a[i][j]=0;
}//如果該位置固定
else
{
int k; //試數
for(k=1;k<=6;k++){
if(test(b,i,j,k)) //可以
{
b[i][j]=k;
SD(b,n+1);
b[i][j]=0;
}
if(n==180)
break;
}
}
}
int main()
{
int a[30][6];
printf("請輸入原始資料,沒有資料用0代替。\n");
for(int i=0;i<30;i++)
for(int j=0;j<6;j++)
scanf("%d",&a[i][j]);
printf("-------------------\n\n");
SD(a,0);
if(count==0){
printf("此陣列無解!");
return 0;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/110152.html
標籤:C++ 語言
