深搜70分 3个T 调了好久不知道为啥~~
查看原帖
深搜70分 3个T 调了好久不知道为啥~~
545026
syLph楼主2022/7/9 11:10
#include<stdio.h>
#include<memory.h>
#define MAXN 30
char w[MAXN][MAXN];
int opr[MAXN][MAXN],used[MAXN];
int nums[MAXN],find = 0,n;
int ck(){
    for(int i=n-1,x=0;i>=0;i--) {
        int A=nums[opr[0][i]],B=nums[opr[1][i]],C=nums[opr[2][i]];
        if((A+B+x)%n!=C) return 0;
        x=(A+B+x)/n;
    }
    return 1;

}
void dfs(int i){
    if ( nums[opr[0][0]] + nums[opr[1][0]] >= n ) return;
    for (int j = 0 ; j < n ; j ++ ){
        int x = nums[opr[0][j]],y = nums[opr[1][j]],z = nums[opr[2][j]];
        if ( x == -1 || y == -1 || z == -1 ) continue;
        if ( (x + y) % n != z && ( x + y + 1 ) % n != z )
            return;
        
    }
    if (find == 1 ) return;
    if ( i == n ){
        if ( ck() == 1 ) {
            for (int j = 0 ; j < n ; j ++ ) printf("%d ",nums[j]);
            find = 1;
        }
        return;
    }
    for (int j = n - 1 ; j >= 0  ; j -- ){
        if ( !used[j] ) {
            nums[i] = j;
            used[j] = 1;
            dfs(i+1);
            nums[i] = -1;
            used[j] = 0;
        } 
    }

}
int main(){//7 2 0 8 4 9 1 3 5 6
    //freopen("testdata.in","r",stdin);
    memset(nums,-1,sizeof(nums));
    memset(opr,-1,sizeof(opr));
    scanf("%d",&n);
    for (int i = 0 ; i < 3 ; i ++ ) scanf("%s",w[i]);
    for (int k = 0 ; k < 3 ; k ++ ){
        for (int l = 0 ; l < n ; l ++ ){
            opr[k][l] = w[k][l] - 'A';
        }
    }
    dfs(0);
    return 0;
}
2022/7/9 11:10
加载中...