蓝桥杯2016第七届C语言B组省赛习题题解——习题F. 方格填数**

每日刷题(九十八)

蓝桥杯第七届C语言B组省赛习题

习题F:方格填数

在这里插入图片描述
图1.jpg
在这里插入图片描述

思路:

首先全排列模版套上,然后在check()函数里设置条件使得连续的数不相邻,因此我们可以像以下这么规定:
在这里插入图片描述

C++代码:

#include<bits/stdc++.h>
using namespace std;

int a[10] = {
    
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int ans = 0;

bool check()
{
    
    
	if(abs(a[0] - a[1]) == 1 || 
	   abs(a[0] - a[3]) == 1 || 
	   abs(a[0] - a[4]) == 1 || 
	   abs(a[0] - a[5]) == 1 ||
	
	   abs(a[1] - a[2]) == 1 ||
	   abs(a[1] - a[4]) == 1 ||
	   abs(a[1] - a[5]) == 1 ||
	   abs(a[1] - a[6]) == 1 ||
	   
	   abs(a[2] - a[5]) == 1 ||
	   abs(a[2] - a[6]) == 1 ||
	   
	   abs(a[3] - a[4]) == 1 ||
	   abs(a[3] - a[7]) == 1 ||
	   abs(a[3] - a[8]) == 1 ||
	   
	   abs(a[4] - a[5]) == 1 ||
	   abs(a[4] - a[7]) == 1 ||
	   abs(a[4] - a[8]) == 1 ||
	   abs(a[4] - a[9]) == 1 ||
	   
	   abs(a[5] - a[6]) == 1 ||
	   abs(a[5] - a[8]) == 1 ||
	   abs(a[5] - a[9]) == 1 ||
	   
	   abs(a[6] - a[9]) == 1 ||
	   
	   abs(a[7] - a[8]) == 1 ||
	   
	   abs(a[8] - a[9]) == 1)
		return false;
	return true;
}

void f(int k)
{
    
    
	if(k == 10)
	{
    
    
		bool b = check();
		if(b)
			ans++;
		return;
	}
	
	for(int i = k; i < 10; i++)
	{
    
    
		{
    
    
			int t = a[i];
			a[i] = a[k];
			a[k] = t;
		}
		f(k + 1);
		{
    
    
			int t = a[i];
			a[i] = a[k];
			a[k] = t;
		}
	}
}

int main()
{
    
    
	f(0);
	cout << ans << endl;
	return 0;
}

运行结果:
在这里插入图片描述
因此答案就是1580

方法二:

思路如图:
在这里插入图片描述
C++代码:

#include<bits/stdc++.h>
using namespace std;

int a[5][6];
int vis[10];
int ans;

bool check(int i, int j)
{
    
    
	for(int x = i - 1; x <= i + 1; x++)
	{
    
    
		for(int y = j - 1; y <= j + 1; y++)
		{
    
    
			if(abs(a[x][y] - a[i][j]) == 1)
				return false;			
		}
	}
	return true;
}

void f(int x, int y)
{
    
    
	if(x == 3 && y == 4)
	{
    
    
		ans++;
		return;
	}
	for(int i = 0; i < 10; i++)
	{
    
    
		if(vis[i] == 0)
		{
    
    
			a[x][y] = i;
			if(!check(x, y))
			{
    
    
				a[x][y] = -10;
				continue;
			}
			vis[i] = 1;		//标记为已访问 
			if(y == 4)
				f(x + 1, 1);
			else
				f(x, y + 1);
			{
    
    			//回溯 
				vis[i] = 0;
				a[x][y] = -10;
			}
		}
	}
}

void init()
{
    
    
	for(int i = 0; i < 5; i++)
	{
    
    
		for(int j = 0; j < 6; j++)
		{
    
    
			a[i][j] = -10;
		}
	}
}

int main()
{
    
    
	init();
	f(1, 2);
	cout << ans << endl;
	return 0;
}

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/104989087