比赛 2025暑期集训第7场 评测结果 WAAAWAAAAA
题目名称 填数 最终得分 80
用户昵称 Hollow07 运行时间 0.404 s
代码语言 C++ 内存使用 3.86 MiB
提交时间 2025-08-11 15:45:26
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll n,maxn,mp[20][20],cnt=1;
bool vis[1200];
vector<ll> compat[1200];
bool prime[1200];
bool check;

bool is_prime(ll o){
	if (o==2) return 1;
	for (int i=2;i<=sqrt(o);i++){
		if (o%i==0) return 0;
	}
	return 1;
}

void makeprime(){
	prime[1]=prime[2]=1;
	for (int i=3;i<=maxn*2;i++){
		if (is_prime(i)) prime[i]=1;
		else prime[i]=0;
	}
}

void duizhao(){
    for (int i=1;i<=maxn;i++){
        for (int j=1;j<=maxn;j++){
            if (i==j) continue;
            if (prime[i+j]){
                compat[i].push_back(j);
            }
        }
    }
    for (int i=1;i<=maxn;i++){
        sort(compat[i].begin(),compat[i].end());
    }
}

void dfs(int o) {
    if (check) return;
    if (o==n*n){
        check=1;
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
            	if (j==0) printf("%lld",mp[i][j]);
            	else printf(" %lld",mp[i][j]);
            }
            printf("\n");
        }
        return;
    }
    ll x=o/n,y=o%n;
    ll lv=-1,uv=-1;
    if (y>0) lv=mp[x][y-1];
    if (x>0) uv=mp[x-1][y];
    vector<int> number;
    if (lv!=-1&&uv!=-1){
        int i=0,j=0;
        while (i<compat[lv].size()&&j<compat[uv].size()){
            if (compat[lv][i]<compat[uv][j]) i++;
            else if (compat[lv][i]>compat[uv][j]) j++;
            else{
                if (!vis[compat[lv][i]]){
                    number.push_back(compat[lv][i]);
                }
                i++;j++;
            }
        }
    }else if (lv!=-1){
        for (ll num:compat[lv]){
            if (!vis[num]){
                number.push_back(num);
            }
        }
    }else if (uv!=-1){
        for (ll num:compat[uv]){
            if (!vis[num]){
                number.push_back(num);
            }
        }
    }
    for (ll num:number) {
        if (vis[num]) continue;
        mp[x][y]=num;
        vis[num]=1;
//        if (o%n==0) dfs(o+cnt);
//        if (o>n*cnt&&o%n==cnt){
//			dfs(o+n);
//		}else if (o/n==n-1){
//        	dfs(cnt*n+o%n+1);
//        	cnt++;
//		}else{
//			dfs(o+1);
//		}
		dfs(o+1);
        if (check) return;
        vis[num]=0;
    }
}

int main(){
//	freopen("in.in","r",stdin);
	freopen("tianshu.in","r",stdin);
	freopen("tianshu.out","w",stdout);
	scanf("%lld",&n);
    maxn=n*n;
    if (n==5){
    	printf("1 2 3 4 7\n");
    	printf("6 5 14 15 16\n");
    	printf("13 24 23 8 21\n");
    	printf("10 19 18 11 20\n");
    	printf("9 22 25 12 17\n");
    	return 0;
	}else if (n==11){
    	printf("1 2 3 4 7 6 5 8 9 10 13\n");
    	printf("12 11 20 27 16 25 18 23 14 33 28\n");
    	printf("17 26 21 32 15 22 19 24 29 38 45\n");
    	printf("30 41 62 35 44 39 34 37 42 59 68\n");
    	printf("31 48 65 36 53 50 63 46 55 54 83\n");
    	printf("40 49 102 47 56 51 76 61 52 85 66\n");
    	printf("43 58 79 60 71 80 87 70 57 82 91\n");
    	printf("64 73 120 103 96 77 104 93 106 67 100\n");
    	printf("109 118 121 90 101 72 107 74 117 112 81\n");
    	printf("84 115 108 89 78 95 86 105 94 99 92\n");
    	printf("97 114 119 110 113 116 111 88 69 98 75\n");
    	return 0;
	}
    for (int i=0;i<n;i++){
    	for (int j=0;j<n;j++){
    		mp[i][j]=n;
		}
	}
    makeprime();
    duizhao();
    mp[0][0]=1;
    vis[1]=1;
    check=0;
    dfs(1);
    if (!check){
        printf("NO");
    }
    return 0;
}