求一组hack(将代码卡T用)
查看原帖
求一组hack(将代码卡T用)
612567
Kazeno_Akina楼主2024/7/11 15:27

代码如下,只有一个剪枝+一个排序优化,然而跑得飞快

求各位大神帮忙想想怎么卡掉,或者能证明复杂度也行

    #include <cstdio>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    int n,a[507][507],t[507],vis[507],st[507],buc[507],h[507];
    struct node{
    	int x,y;
    };
    node v[507];
    void dfs(int u){
        if(u>n){
            printf("YES\n");
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    printf("%d",a[i][t[j]]);
                }
                printf("\n");
            }
            exit(0);
        }
        for(int i=1;i<=n;i++){
            bool flag=false;
    		int p=v[i].x;
            if(!vis[p]){
                for(int j=1;j<=n;j++){
                    if(buc[j]!=h[j] && buc[j] && !a[j][p]){
                        flag=true;
                        break;
                    }
                }
                if(flag) continue;
                for(int j=1;j<=n;j++){
                    if(a[j][p]) buc[j]++;
                }
                t[u]=p;
                vis[p]=1;
                dfs(u+1);
                vis[p]=0;
                for(int j=1;j<=n;j++){
                    if(a[j][p]) buc[j]--;
                }
            }
        }
    }
    bool cmp(node x,node y){
    	return x.y<y.y;
    }
    int main(){
    //    freopen("meow.in","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%1d",&a[i][j]);
                h[i]+=a[i][j];
    			v[j].x=j;
    			v[j].y+=a[i][j];
            }
    	}
    	sort(v+1,v+1+n,cmp);
        dfs(1);
        printf("NO");
        return 0;
    }
2024/7/11 15:27
加载中...