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
*/
View Code

 

posted @ 2018-09-30 16:58  Monster_Qi  阅读(244)  评论(0编辑  收藏  举报