【题目链接】

https://www.luogu.org/problemnew/show/P1092

【算法】

搜索 + 剪枝

直接搜索显然会超时,考虑剪枝

1 : 优化搜索顺序

2 : 假设我们已经确定了一组(Ai,Bi,Ci),那么,如果(Ai + Bi) mod n 和(Ai + Bi + 1) mod n都不等于Ci,可以剪枝

【代码】

#include<bits/stdc++.h>
using namespace std; int i,n,len;
int a[],ord[];
char A[],B[],C[];
bool used[],vis[];
bool solved; inline bool ok()
{
int i;
for (i = n; i >= ; i--)
{
if (a[A[i]-'A'+] == -) continue;
if (a[B[i]-'A'+] == -) continue;
if (a[C[i]-'A'+] == -) continue;
if ((a[A[i]-'A'+] + a[B[i]-'A'+]) % n == a[C[i]-'A'+]) continue;
if ((a[A[i]-'A'+] + a[B[i]-'A'+] + ) % n == a[C[i]-'A'+]) continue;
return false;
}
return true;
}
inline void print()
{
int i;
for (i = ; i <= n; i++) printf("%d ",a[i]);
printf("\n");
}
inline bool check()
{
int t,b = ;
for (i = n; i >= ; i--)
{
t = (a[A[i]-'A'+] + a[B[i]-'A'+] + b) % n;
if (a[A[i]-'A'+] + a[B[i]-'A'+] + b >= n) b = ;
else b = ;
if (a[C[i]-'A'+] == t) continue;
else return false;
}
if (b) return false;
else return true;
}
inline void dfs(int dep)
{
int i;
if (dep > n)
{
if (check())
{
solved = true;
print();
}
return;
}
if (!ok()) return;
for (i = n - ; i >= ; i--)
{
if (!used[i])
{
a[ord[dep]] = i;
used[i] = true;
dfs(dep+);
if (solved) return;
used[i] = false;
a[ord[dep]] = -;
}
}
} int main()
{ memset(a,,sizeof(a));
scanf("%d%s%s%s",&n,A+,B+,C+);
for (i = n; i >= ; i--)
{
if (!vis[A[i]-'A'+])
{
ord[++len] = A[i] - 'A' + ;
vis[A[i]-'A'+] = true;
}
if (!vis[B[i]-'A'+])
{
ord[++len] = B[i] - 'A' + ;
vis[B[i]-'A'+] = true;
}
if (!vis[C[i]-'A'+])
{
ord[++len] = C[i] - 'A' + ;
vis[C[i]-'A'+] = true;
}
}
dfs(); return ; }

【NOIP 2004】 虫食算的更多相关文章

  1. NOIP 2004 虫食算题解

    问题 E: [Noip2004]虫食算 时间限制: 1 Sec  内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...

  2. Codevs 1064 虫食算 2004年NOIP全国联赛提高组

    1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...

  3. 虫食算 2004年NOIP全国联赛提高组(dfs)

    1064 虫食算 2004年NOIP全国联赛提高组  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descrip ...

  4. 深度优先搜索 codevs 1064 虫食算

    codevs 1064 虫食算 2004年NOIP全国联赛提高组  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 所 ...

  5. 洛谷 P1092 虫食算 Label:dfs

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  6. codevs1064 虫食算

    题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045    +    8468#6 ...

  7. NOIP2004 虫食算

    描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...

  8. Luogu P1092 虫食算

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  9. 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算

    题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...

  10. 【NOIP2004】虫食算

    Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...

随机推荐

  1. Eclipse中配置SVN(步骤简述)

    ————Eclipse中配置SVN(步骤简述)———— 1.有客户端(tortoiseSVN),服务器端(visualSVN) 两种,根据需要安装,安装后需重启电脑 2.服务器端配置:创建版本库(放工 ...

  2. 解决 C# webbrowser 弹出json下载问题

    把以下内容保存为 .reg ,然后导入注册表,即可解决C# webbrowser 弹出json下载问题,也可通过程序修改. Windows Registry Editor Version 5.00 [ ...

  3. 解决Fiddler抓包上不了网的问题:

    以前安装Fiddler 没有配置过相关设置,经常出现就是打开fiddler后,浏览器就无法上网了,刚开始觉得可能是因为而公司上网是需要自己的代理的,但fiddler打开后默认127.0.0.1作为IE ...

  4. java 循环document 通用替换某个字符串或特殊字符

    document 生成xml时 报错 XML-20100: (Fatal Error) Expected ';'.  查了半天发现是 特殊字符 & 不能直接转出,需要进行转换,因为是通用方法很 ...

  5. React Native未来导航者:react-navigation 使用详解

    该库包含三类组件: (1)StackNavigator:用来跳转页面和传递参数 (2)TabNavigator:类似底部导航栏,用来在同一屏幕下切换不同界面 (3)DrawerNavigator:侧滑 ...

  6. react功能实现-数组遍历渲染

    在react中如何将一个数组遍历,并且逐个渲染在页面上? 1.在jsx渲染中,如果这个变量是一个数组,则会展开这个数组的所有成员. var arr = [ <h1>Hello world! ...

  7. 使用.Net Core RT 标准动态库

    这个文档可以引导你如何通过CoreRT生成一个原生标准的系统动态库让其他编程语言调用. CoreRT 可以构建静态库, 这些库可以在编译时链接或者也可以构建运行时所需的共享库, 创建一个支持CoreR ...

  8. 【ubuntu子系统】使用windows自带的ubuntu子系统

      在windows10系统中,自带了一款ubuntu子系统,就像是一个应用程序,一款软件,提供ubutnu的terminal窗口,可以使用对应的命令行模式.最重要的是,可以直接用来连接linux服务 ...

  9. (C/C++学习)2.C语言中文件流操作基本函数总结

    函数所在头文件:stdio.h 说明:前半部分主要为对各个文件流操作函数的例举,后半部分着重于上机运行分析.文中部分引用自王桂林老师的C/C++课件. 1.FIELE *fopen(const cha ...

  10. centos最小化系统安装VMware tool

    1.先执行命令创建环境 yum -y install update yum -y install gcc kernel-headers kernel-devel 2.然后重启reboot 3.挂载,解 ...