P1092 虫食算 题解(搜索)
题目链接
解题思路
好题啊!这个搜索好难写......
大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错......
首先这个从后往前搜比较好想,按照从后往前出现的顺序搜,在这个剪枝条件下速度会快很多。
比如样例,
5
ABCED
BDACE
EBBAA
从右往左出现的次序是\(DEAECACABBDBABE\),去重之后是\(DEACB\),这就是要搜索的顺序,用\(seq\)记录。
当某时候等式明显已经不满足时,就直接\(return\)。
还有别的剪枝,但这样直接能\(79ms\)。没必要。
AC代码
#include<stdio.h>
#include<stdlib.h>
#define N 30
int n,a[N],b[N],c[N],vis[N],ans[N];
char s[3][N];
int seq[N];//搜索顺序
void dfs(int x){//搜到第x个元素
int i,jw=0;
if(ans[a[0]]+ans[b[0]]>=n)return;
for(i=n-1;i>=0;i--){//从后往前检查
int A=ans[a[i]],B=ans[b[i]],C=ans[c[i]];
if(A==-1||B==-1||C==-1)continue;
if((A+B+1)%n!=C&&(A+B)%n!=C)return;
}
if(x==n){
for(i=n-1;i>=0;i--){
int A=ans[a[i]],B=ans[b[i]],C=ans[c[i]];
if((A+B+jw)%n!=C)return;
jw=(A+B+jw)/n;
}
for(i=0;i<n;i++)printf("%d ",ans[i]);
exit(0);
}
for(i=n-1;i>=0;i--){
if(!vis[i]){
vis[i]=1;ans[seq[x]]=i;
dfs(x+1);
vis[i]=0;ans[seq[x]]=-1;
}
}
}
int cnt;
void f(int x){//提供搜索顺序,加快搜索速度
if(!vis[x]){vis[x]=1;seq[cnt++]=x;}
}
int main(){
int i;
for(i=0;i<30;i++)ans[i]=-1;
scanf("%d%s%s%s",&n,s[0],s[1],s[2]);
for(i=0;i<n;i++){
a[i]=s[0][i]-'A';
b[i]=s[1][i]-'A';
c[i]=s[2][i]-'A';
}
for(i=n-1;i>=0;i--){f(a[i]);f(b[i]);f(c[i]);}
for(i=0;i<n;i++)vis[i]=0;
dfs(0);
return 0;
}
这是seq优化后的结果:
这是从n-1到1搜索的结果:
而这是从1到n-1搜索的结果:
P1092 虫食算 题解(搜索)的更多相关文章
- Luogu P1092 虫食算【搜索/剪枝】 By cellur925
题目传送门 这道题是一道经久不衰的搜索题目,但是开始做的时候我没什么思路==.初始值-1 输出格式 \(naive\)想法 从右往左依次尝试填充数字,把算式当做一个3行\(n\)列的网格.(什么?你问 ...
- P1092 虫食算——题解
题目传送 (据说官方正解为高斯消元,但用搜索也能过,这里就讲讲搜索算法吧.) 对于一道搜索题,首先考虑一下大体怎样搜索.因为要考虑加法的进位,所以从左往右搜索对于考虑进位来说十分麻烦,而从右往左搜索就 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- Luogu P1092 虫食算(枚举+剪枝)
P1092 虫食算 题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 4 ...
- 【搜索】$P1092$虫食算
题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...
- [BZOJ1902]:[NOIP2004]虫食算(搜索)
题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 来看一个简单的例子: 43#98650#45+8468#6633=444455069 ...
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- [NOIP2004] 提高组 洛谷P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
随机推荐
- VS常用命令
1.查看Windows文件首部信息 dumpbin/headers 项目名称. 例如:dumpbin/headers test.exe 2.查看CLR首部信息 dumpbin/clrheader 项目 ...
- leetcode 2 两数相加 考虑溢出
先用int存了结果然后出错,int溢出了. 真是憨批嗷. 不用考虑保存结果,直接一位一位计算就行. 感觉被描述误导了. /** * Definition for singly-linked list. ...
- Ubuntu16安装Caffe+Python3缺少libboost
如果在/usr/lib/x86_64-linux-gnu中找到libboost_python-py3.5.so, 则 sudo ln -s libboost_python-py3.5.so libbo ...
- 将从摄像头即时读入的人像放入背景视频中_with_OpenCV_in_Python
import cv2 import numpy as np import time cap = cv2.VideoCapture(0) background_capture = cv2.VideoCa ...
- copy-webpack-plugin & ignore folder
copy-webpack-plugin & ignore folder https://github.com/webpack-contrib/copy-webpack-plugin#ignor ...
- React Hooks 内部实现原理
React Hooks 内部实现原理 源码分析 // 链表 React Hooks 原理剖析 refs https://reactjs.org/docs/hooks-intro.html https: ...
- github & gist & Weekly development breakdown
github & gist & Weekly development breakdown https://gist.github.com/xgqfrms WakaTime waka-b ...
- open an iOS simulator from the terminal
open an iOS simulator from the terminal # simulator $ open -a Simulator flutter https://flutter.dev/ ...
- Flutter: 使用相机拍照
文档 camera import 'dart:io'; import 'package:camera/camera.dart'; import 'package:flutter/material.da ...
- Mybatis-03 配置解析
Mybatis-03 配置解析 配置解析 1.核心配置文件 mybatis-config.xml: configuration(配置) properties(属性) settings(设置) type ...