LUGOU P1092 虫食算

传送门

解题思路

刚开始按yzy神犇给的方法写,就是每次要把能算出来的都算出来,结果因为太菜写挂了。。后来直接爆搜水过。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>

using namespace std;
const int MAXN=40;

int n,a[MAXN],cnt;
char s[4][MAXN];
bool vis[MAXN],flag;

bool check(){
    for(register int j=n;j;j--){
        if(a[s[1][j]-‘A‘]<0 || a[s[3][j]-‘A‘]<0 || a[s[2][j]-‘A‘]<0) continue;
        if((a[s[1][j]-‘A‘]+a[s[2][j]-‘A‘])%n!=a[s[3][j]-‘A‘]
         && (a[s[1][j]-‘A‘]+a[s[2][j]-‘A‘]+1)%n!=a[s[3][j]-‘A‘]) return false;
    }
    return true;
}

bool pd(){
    int pre=0;
    for(register int j=n;j;j--){
        if((a[s[1][j]-‘A‘]+a[s[2][j]-‘A‘]+pre)%n!=a[s[3][j]-‘A‘]) return false;
        pre=(a[s[1][j]-‘A‘]+a[s[2][j]-‘A‘]+pre)/n;
    }
    return pre?false:true;
}

void dfs(int x,int now){
    if(now==4) {now=1;x--;if(x==0) {if(pd()) flag=1;return;}}
    if(a[s[now][x]-‘A‘]>=0) {dfs(x,now+1);return;}
    for(register int i=n-1;i>=0;i--){
        if(vis[i]) continue;
        vis[i]=1;a[s[now][x]-‘A‘]=i;
        if(!check()) {vis[i]=0;a[s[now][x]-‘A‘]=-1;continue;}
        dfs(x,now+1);if(flag) return;vis[i]=0;a[s[now][x]-‘A‘]=-1;
    }
}

int main(){
    memset(a,-1,sizeof(a));
    scanf("%d%s%s%s",&n,s[1]+1,s[2]+1,s[3]+1);
    dfs(n,1);
    for(register int i=0;i<n;i++) printf("%d ",a[i]);
    return 0;
}

/*
4
BADC
CBDA
DCCC
*/

原文地址:https://www.cnblogs.com/sdfzsyq/p/9732585.html

时间: 2024-10-11 05:58:43

LUGOU P1092 虫食算的相关文章

洛谷 P1092 虫食算

P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/25448822/ 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,

Luogu P1092 虫食算(枚举+剪枝)

P1092 虫食算 题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 44445509678 其中 \(\#\) 号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是 \(5\) 和 \(3\) ,第二行的数字是 \(5\) . 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是 \(N\) 进制加法,算式中三个数都有 \(N\

[NOIP2004] 提高组 洛谷P1092 虫食算

题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用

洛谷—— P1092 虫食算

https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/25448822/ 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前

洛谷 P1092 虫食算 Label:dfs

题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用

Luogu P1092 虫食算

题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中#号代表被虫子啃掉的数字.根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5. 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用

洛谷P1092虫食算——深搜

题目:https://www.luogu.org/problemnew/show/P1092 剪枝1:从右往左.从上往下按字母出现顺序搜索: 剪枝2:同一列前两个数字确定,可直接算出第三个数字并判断: 剪枝3:每次搜索前看看前面的列上有没有已经不符合的情况(进位最多为1): 代码如下: #include<iostream> #include<cstdio> using namespace std; int n,c[300],jin[30]; char a[5][30]; bool

P1092 虫食算

题目传送:https://www.luogu.org/problem/show?pid=1092 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #define maxn 30 int n,flag[maxn]; char s[4][maxn]; bool use[maxn]; int id(char ch)/

P1092虫食算题解

2018-10-24 题目链接 题目思路: 我就讲下剪枝操作吧. 三个式子从上到下为A,B,C 剪枝操作 1.从3个式子右边开始从上到下枚举字母对应数字.(搜索顺序关键) 2.末尾(A+B)%n!=C. 3.已知A,B,不知C,且C的可能数字已经使用.(这三个点从2000ms) 4.已知A.C,不知B,且B的可能数字已经使用.(一下剪枝成) 5.已知B,C,不知A,且A的可能数字已经使用.(100ms) 6.已知A,B,C,且A+B不等于C,且A+B+1不等于C. 7.已经A,B,C的最高位,且