2 条题解

  • 1
    @ 2025-10-13 20:54:44

    真·数字方阵

    观察样例可以发现,分割出的非右上角小方阵最后都会变成 1 0 1 1 的单位方阵,所以可以通过递归来操作,直到最后到达单位长度后就进行操作

    参考代码(python)

    from sys import stdin,setrecursionlimit
    from math import inf,ceil,sqrt
    from collections import Counter,deque
    
    def dfs(x:int,y:int,p:int):
        if p==1:
            s[x+1][y-1]=1
            s[x+1][y]=1
            s[x][y-1]=1
            return
        dfs(x+(1<<(p-1)),y,p-1)
        dfs(x,y-(1<<(p-1)),p-1)
        dfs(x+(1<<(p-1)),y-(1<<(p-1)),p-1)
    
    
    n=int(stdin.readline())
    s=[[0 for _ in range(1<<n)]for i in range(1<<n)]
    dfs(0,(1<<n)-1,n)
    for i in s:
        print(' '.join(map(str,i)))
    
    
    • 1
      @ 2025-10-13 19:56:12

      原题:P5461 赦免战俘 - 洛谷

      递归题。我不相信有人能在赛场上手敲出1024*1024(n=10)的矩阵...

      参考代码(C++):

      #include <bits/stdc++.h>
      using namespace std;
      
      int m[1030][1030];
      
      void draw(int sx, int sy, int l) {
          if (l == 1) {
              m[sx][sy] = 1;
              return;
          }
          draw(sx, sy, l / 2);
          draw(sx + l / 2, sy, l / 2);
          draw(sx + l / 2, sy + l / 2, l / 2);
      }
      
      int main() {
          int n;
          cin >> n;
          int len = pow(2, n);
          draw(1, 1, len);
          for (int i = 1; i <= len; i++) {
              for (int j = 1; j <= len; j++) {
                  cout << m[i][j] << " ";
              }
              cout << "\n";
          }
          return 0;
      }
      
      • 1

      信息

      ID
      1093
      时间
      1000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      23
      已通过
      7
      上传者