第七届————蓝桥杯————方格填数 {C语言,方便观察,输出了结果}


方格填数

如下的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);
} 


 

猜你喜欢

转载自blog.csdn.net/weixin_42295018/article/details/88593791
今日推荐