【YBTOJ】虫食算

119 篇文章 0 订阅
34 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述

思路:

这道题我们考虑搜索
我们枚举每一个数字代表着什么值,而最难得的就是判断是否合法
我们肯定从低位到高位算,首先如果当前这一位上三个值都被枚举过了,那我们就可以直接进行加法进位,然而如果当前这一位上有一个值没有被枚举过,我们就可以设一个标记为-1
然后如果在设为-1之后又有一位上三个值都被枚举过了的话,那么我们就分成是否被进位讨论,如果没有进位,那么a+b的最低位就要等于c,如果没有进位,那么a+b+1的最低位就要等于c,如果两个条件都不满足,着表明判断失败,直接返回
😁😁😁

c o d e code code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
string s[4];
char ss[100];
bool v[100], b[100];
int num[100];
bool check()
{
	int x=0;
	for(int i=n-1; i>=0; i--)
	{
		int a=num[s[1][i]-'A'];
		int b=num[s[2][i]-'A'];
		int c=num[s[3][i]-'A'];
		if(a!=-1&&b!=-1&&c!=-1)
		{
			if(x!=-1)
			{
				if((a+b+x)%n!=c)
					return 0;
				if(i==0&&a+b+x>=n)
					return 0;
				x=(a+b+x)/n;
			}
			else
			{
				if((a+b)%n!=c&&(a+b+1)%n!=c)
					return 0;
				if(i==0&&a+b+x>=n)
					return 0;
			}
		}
		else
			x=-1;
	}
	return 1;
}
bool dfs(int x)
{
	if(x>n)
		return 1;
	for(int i=0; i<n; i++)
	{
		if(b[i]==0)
		{
			b[i]=1;
			num[ss[x]-'A']=i;
			if(check()&&dfs(x+1))
				return 1;
			b[i]=0;
			num[ss[x]-'A']=-1;
		}
	}
	return 0;
}
int main()
{
	memset(num, -1, sizeof(num));
	scanf("%d", &n);
	for(int i=1; i<=3; i++)
		cin>>s[i];
	for(int j=n-1; j>=0; j--)
		for(int i=1; i<=3; i++)
		{
			if(v[s[i][j]-'A']==0)
			{
				v[s[i][j]-'A']=1;
				ss[++m]=s[i][j];
			}
		}
	dfs(1);
	for(int i=0; i<n; i++)
		printf("%d ", num[i]);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值