2017年(第八届)国赛A~E题C++B组题解

这篇博客详细解答了2017年国赛A至E题的C++解题思路,涉及36进制、瓷砖样式、希尔伯特曲线、发现环和对局匹配等问题。通过暴力搜索、哈希去重、拓扑排序、并查集等算法,解析了题目中的关键难点,并提供了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A:36进制

蓝桥云课提交链接

答案:1040254

B:瓷砖样式

蓝桥云课提交链接

答案:101466

题解:

  1. 暴力搜索+Hash去重。
  2. 搜索规则:先涂满整个格子,判断满足满足条件,满足条件的情况下再判断是否重复。
    ——涂色规则:0表示黄色,1表示橙色,分两种放瓷砖的方式,横或者竖,但都是先铺满一行,再去铺下一行,横纵都是这样。
    ——如何让确保所有格子都有颜色:虽然一次性涂2个格子,但是再搜索时一个格子一个格子的去判断是否涂色。
  3. 如何哈希去重: 利用两个素数B和MOD,一个用来当权值进行乘权,一个用来取余。
    Hash值=(e[1][1] * B ^ 0+e[1][2] * B ^ 2 + … + e[3][10] * B ^ 29 ) % MOD
    利用这样的计算,一般情况下,如果数组内的排列顺序稍微不一样,得到的哈希值便不同。

代码:

#include<stdio.h>
#include<string.h>
#include<map> 
#include<algorithm>
#define B 29
#define MOD 10000000009
using namespace std;
typedef long long ll; 
map<ll,ll> Hash;
int e[5][15];
int n=3,m=10;//代表行和列 
int count1=0;//计数 
bool check_color()
{
	for(int i=1;i<n;i++)
    	for(int j=1;j<m;j++)
        	if((e[i][j]+e[i+1][j]+e[i][j+1]+e[i+1][j+1])%4==0)//4个值相同才能取余为0 
            	return false;
	return true; 
}
void dfs(int x,int y)
{
	if(e[x][y]==-1)
	{
    	//横向涂色 
    	if(y+1<=m&&e[x][y+1]==-1)
    	{
        	//0代表黄色,1代表橙色 
        	for(int i=0;i<2;i++)
        	{
            	e[x][y]=e[x][y+1]=i;    
            	//为了保证每个地方都可以被涂色,这里+1,不是+2;
            	//如果该行被涂满时,切换下行在最后。 
          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值