Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
耗时1个小时,最简单的dfs没有剪枝100ms,庆祝1Y,留念//写了一个小时,最简单的dfs,没有剪枝,只是加了搜索顺序,就能在100ms左右AC了,并且1Y,鼓励自己一下,留念。 #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; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator