1 条题解
-
0
🔍 解题思路
根据元素取值范围和制约力确定搜索顺序
1、最后一行和最后一列是取值范围最小的搜索元素,而且它们对其他所有的元素都有一定的制约力,因此要放在搜索序列的最前面。
2、两条对角线同样影响到其他所有的搜索元素,制约力在剩下的格子中是最大的,因此也应当优先搜索。
3、剩下的行列依据它们取值范围的大小确定搜索顺序
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> using namespace std; int sum, fir; const int MAX = 100000; const int SQRT = 318; bool v[MAX] = {1,1}; bool n[11][11][11][11][11] = {0}; int a[5]; int pri[MAX]; int priLen = 0; int maze[5][5]; bool vis[5][5]; struct ANS { short ma[5][5]; }ans[1000]; int ansLen = 0; bool operator<(const ANS& a1, const ANS& a2) { for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { if (a1.ma[i][j] < a2.ma[i][j]) { return 1; } else if (a1.ma[i][j] > a2.ma[i][j]) { return 0; } } } return 0; } #define FOR(i) for(ii[i]=0;ii[i]<2;++ii[i]){if(ii[i]==0)aa[i]=a[i];else aa[i]=10; inline void deal(int k) { int tmp = 0; for (int j = 4; j >= 0; -- j) { tmp += a[j] = k%10; k /= 10; } if (tmp != sum) { return; } int ii[5]; int aa[5]; FOR(0) FOR(1) FOR(2) FOR(3) FOR(4) n[aa[0]][aa[1]][aa[2]][aa[3]][aa[4]]=1; } } } } } } void init() { scanf("%d%d",&sum,&fir); n[10][10][10][10][10]=1; for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { maze[i][j] = 10; } } maze[0][0] = fir; //vis[0][0] = 1; priLen = 0; ansLen = 0; for (int i = 2; i < SQRT; ++ i) { if (!v[i]) { for (int j = i*i; j < MAX; j += i) { v[j] = 1; } } } for (int i = 10001; i < MAX; ++ i) { if (!v[i]) { pri[priLen++] = i; deal(i); } } } /* 搜索顺序 0 1 2 3 4 0 0 1 2 3 4 1 5 9 13 14 15 2 6 21 10 18 22 3 7 23 16 11 24 4 8 20 17 19 12 */ inline bool is_prime() { return n[a[0]][a[1]][a[2]][a[3]][a[4]]; } int dir[25][2] = {{0,0},{0,1},{0,2},{0,3},{0,4},{1,0},{2,0},{3,0},{4,0},{1,1},{2,2},{3,3},{4,4},{1,2},{1,3},{1,4},{3,2},{4,2},{2,3},{4,3},{4,1},{2,1},{2,4},{3,1},{3,4}}; inline bool ok() { for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { a[j] = maze[i][j]; } if (!is_prime()) { return 0; } } for (int j = 0; j < 5; ++ j) { for (int i = 0; i < 5; ++ i) { a[i] = maze[i][j]; } if (!is_prime()) { return 0; } } for (int i = 0; i < 5; ++ i) { a[i] = maze[i][i]; } if (!is_prime()) { return 0; } for (int i = 4, j = 0; j < 5; -- i, ++ j) { a[j] = maze[i][j]; } if (!is_prime()) { return 0; } else { return 1; } } void print() { for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { if (maze[i][j] == 10) printf(" "); else printf("%d",maze[i][j]); } printf("\n"); } printf("# # # # # # # # #\n"); } void dfs(int id) { //print(); if (id == 25) { for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { ans[ansLen].ma[i][j] = maze[i][j]; } } ++ ansLen; return; } int x=dir[id][0],y=dir[id][1]; for (int i = 0; i < 10; ++ i) { maze[x][y] = i; if (ok()) { dfs(id+1); } } maze[x][y] = 10; } int main() { init(); dfs(1); sort(ans, ans+ansLen); for (int k = 0; k < ansLen; ++ k) { for (int i = 0; i < 5; ++ i) { for (int j = 0; j < 5; ++ j) { printf("%d",ans[k].ma[i][j]); } printf("\n"); } printf("\n"); } return 0; }
- 1
信息
- ID
- 166
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者