洛谷B3738素数方阵

url: https://www.luogu.com.cn/problem/B3738

tag:
模拟,数学

思路:
数据范围比较小,可以用模拟的方式来通过这道题。比较难的部分应该是蛇形填充。这里可以先用一个数组来存放四个前进的方向。之后每次都判断一下前进之后的位置符不符合要求(不越界且当前位置没有被填充过),如果符合要求则前进,然后将数字放进矩阵,否则就换一个方向。

代码:

  1. #include <iostream>
  2. using namespace std;
  3. int n, x, y;
  4. const int N = 22;
  5. int p[410], dp[N][N], d;
  6. int dir[4][2] = {
  7. {0, 1},
  8. {1, 0},
  9. {0, -1},
  10. {-1, 0},
  11. };
  12. bool is_pr(int x)
  13. {
  14. for (int i = 2; i * i <= x; i ++)
  15. {
  16. if (x % i == 0) return false;
  17. }
  18. return true;
  19. }
  20. int main()
  21. {
  22. cin >> n >> x >> y;
  23. int k = 2;
  24. for (int i = 1; i <= n * n; i ++)
  25. {
  26. while (!is_pr(k++));
  27. p[i] = --k;
  28. k ++;
  29. }
  30. int nx = 0, ny = 0;
  31. dp[0][0] = p[1];
  32. for (int i = 2; i <= n * n; i ++)
  33. {
  34. int tmpx, tmpy;
  35. tmpx = nx + dir[d][0], tmpy = ny + dir[d][1];
  36. if (tmpx >= n || tmpx < 0 || tmpy >= n || tmpy < 0 || dp[tmpx][tmpy])
  37. {
  38. d = (d + 1) % 4;
  39. tmpx = nx + dir[d][0], tmpy = ny + dir[d][1];
  40. }
  41. nx = tmpx, ny = tmpy;
  42. dp[nx][ny] = p[i];
  43. }
  44. cout << dp[x - 1][y - 1] << endl;
  45. return 0;
  46. }
添加新评论