方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
思路:这个题类似于八皇后,用的dfs,但是得每输入一个皇后就得判断是否成功,
我的思路是先用全排列,把十个数字排列好之后,再放到b[3][4]数组中,依次判断是否成功
如果期间有一个不成功则返回零,到最后的时候说明都成功了,返回1
为了方便你们测试,我把结果都输出了,
下面两段函数基本一样,就是多写了几个函数,从而变成了这个题的答案
扫描二维码关注公众号,回复:
5596089 查看本文章
这样写复杂度可能高,但是方便理解
以下是方格填数
#include<stdio.h>
int b[3][4] = {0};
int count = 0;
int ceshi(int x,int y)//测试单个点是否成功
{
int i,j;
int k = b[x][y];
for(i = x-1; i < x+2;i++)
{
for(j = y-1;j < y + 2; j++)
{
if(i < 0 || j < 0)continue;
if(i > 2 || j > 3)continue;
if(i == 0 && j == 0)continue;
if(i == 2 && j == 3)continue;
if(k == b[i][j] - 1 || k == b[i][j] + 1)
return 0;
}
}
return 1;
}
int printff()//出
{
int i,j,k = 0;
printf("第%d种\n",count+1);
for(i = 0; i < 3; i++)
{
if(k++ == 0)
printf(" ");
for(j = 0; j < 4; j++)
{
if(i == 0 && j == 0)continue;
if(i == 2 && j == 3)continue;
printf("%-3d",b[i][j]);
}
printf("\n");
}
printf("\n\n\n");
}
int f1(int a[])//测试每一个点是否正确
{
int i,j,k = 0,l;
for(i = 0; i < 3; i++)//给b数组赋值
{
for(j = 0; j < 4; j++)
{
if(i == 0 && j == 0)continue;
if(i == 2 && j == 3)continue;
b[i][j] = a[k++];
}
}
for(i = 0; i < 3; i++)//测试b数组中的每一个点是否正确
{
for(j = 0; j < 4; j++)
{
if(i == 0 && j == 0)continue;
if(i == 2 && j == 3)continue;
if(ceshi(i,j) == 0)return 0;//如果不正确则返回0
}
}
return 1;//到最后了肯定正确,则返回1
}
int swap(int a[],int i,int j)//交换
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
int f(int a[],int p,int q)//递归全排列
{
int i;
if(p == q)
{
if(f1(a) == 1)//如果正确则输出
{
printff();//输出
count++;//个数加上1
}
}
else
for(i = p;i <= q; i++)
{
swap(a,i,p);
f(a,p+1,q);
swap(a,i,p);
}
}
int main()
{
int a[10] = {0,1,2,3,4,5,6,7,8,9};
f(a,0,9);
printf("%d",count);
}
以下是全排列
#include<stdio.h>
int count = 0;
int swap(int a[],int i,int j)
{
int t;
t = a[i];
a[i] = a[j];
a[j] = t;
}
int f(int a[],int p,int q)
{
int i;
if(p == q)
{
for(i = 0; i < q; i++)
{
printf("%3d",a[i]);
}
printf("\n");
count++;
}
else
for(i = p;i <= q; i++)
{
swap(a,i,p);
f(a,p+1,q);
swap(a,i,p);
}
}
int main()
{
int a[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
f(a,0,3);
printf("%d",count);
}