3 条题解

  • 4
    @ 2023-7-28 19:02:08

    这道题目要求输出在一个N×N格的棋盘中,与给定格子(i,j)同行、同列、同一对角线的所有格子的位置。

    我们可以分别输出四组位置:

    1. 同一行的格子位置:我们只需要固定行号i,将列号从1到N遍历即可。
    2. 同一列的格子位置:我们只需要固定列号j,将行号从1到N遍历即可。
    3. 同一对角线(左上到右下)的格子位置:我们将行号与列号的差值作为判断条件。具体地,当行号与列号的差值相等于(i-j)时,这些格子处于同一对角线上。
    4. 同一对角线(左下到右上)的格子位置:我们将行号与列号的和作为判断条件。具体地,当行号与列号的和相等于(i+j)时,这些格子处于同一对角线上。

    PY:

    n, x, y = map(int, input().split())
    
    # 同一行格子位置
    print(" ".join([f"({x},{i})" for i in range(1, n+1)]))
    
    # 同一列格子位置
    print(" ".join([f"({i},{y})" for i in range(1, n+1)]))
    
    # 同一对角线(左上到右下)格子位置
    print(" ".join([f"({i},{j})" for i in range(1, n+1) for j in range(1, n+1) if i-j == x-y]))
    
    # 同一对角线(左下到右上)格子位置
    print(" ".join([f"({i},{j})" for i in range(n, 0, -1) for j in range(1, n+1) if i+j == x+y]))
    

    C++:

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, x, y;
        cin >> n >> x >> y;
    
        // 同一行格子位置
        for (int i = 1; i <= n; i++) {
            cout << "(" << x << "," << i << ") ";
        }
        cout << endl;
    
        // 同一列格子位置
        for (int i = 1; i <= n; i++) {
            cout << "(" << i << "," << y << ") ";
        }
        cout << endl;
    
        // 同一对角线(左上到右下)格子位置
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (i - j == x - y) {
                    cout << "(" << i << "," << j << ") ";
                }
            }
        }
        cout << endl;
    
        // 同一对角线(左下到右上)格子位置
        for (int i = n; i >= 1; i--) {
            for (int j = 1; j <= n; j++) {
                if (i + j == x + y) {
                    cout << "(" << i << "," << j << ") ";
                }
            }
        }
        cout << endl;
    
        return 0;
    }
    

    这样,我们根据题目要求分别输出了同一行、同一列、同一对角线(左上到右下)和同一对角线(左下到右上)的格子位置。每个位置的格子都用"(x,y)"的格式输出,并用空格隔开。这里我们利用行号和列号的关系来计算每个格子的位置,然后判断位置是否有效(在棋盘范围内),并将有效的格子位置输出。

    代码就是工具,重要的是思想

    • 0
      @ 2023-7-30 21:18:53

      yasuo👀️

      利用逆推,从头一步步靠规律完成输出

      #include <iostream>
      int main(){
          int n,i,j,x,y;std::cin>>n>>i>>j;x=i,y=j;
          for(int j=1;j<=n;j++) std::cout<<"("<<i<<","<<j<<") "; std::cout<<"\n";
          for(int i=1;i<=n;i++) std::cout<<"("<<i<<","<<j<<") "; std::cout<<"\n";
          while(1){if(x<=1||y<=1) break;x--,y--;}
          while(1){if(x>n||y>n) break;std::cout<<"("<<x<<","<<y<<") ";x++,y++;}std::cout<<"\n";
          x=i,y=j;while(1){if(x>=n||y<=1) break;x++,y--;}
          while(1){if(x<1||y>n) break;std::cout<<"("<<x<<","<<y<<") ";x--,y++;}
          return 0;}
      
      • 0
        @ 2023-6-25 13:26:29
        #include<iostream>
         
            #include<cstdio>
         
            using namespace std;
         
            int main()
         
            {
         
                int n,x,y;
         
                int i,j;
         
               
         
                cin>>n;//输入棋盘大小n
         
                cin>>x>>y;//输入棋子所在行列(x,y)
         
               
         
                for(i=1;i<=n;i++)//输出同一行的位置
         
                    printf("(%d,%d) ",x,i);
         
                cout<<endl;
         
                for(i=1;i<=n;i++)//输出同一列的位置
         
                    printf("(%d,%d) ",i,y);
         
                cout<<endl;
         
               
         
                for(i=1;i<=n;i++)//输出左上到右下对角线的位置
         
                    for(j=1;j<=n;j++)
         
                        if(x-y==i-j)
         
                            printf("(%d,%d) ",i,j);
         
                cout<<endl;
         
                for(i=n;i>=1;i--)//输出左下到右上对角线的位置
         
                    for(j=n;j>=1;j--)
         
                        if(x+y==i+j)
         
                            printf("(%d,%d) ",i,j);
         
                cout<<endl;
         
                return 0;
         
            }
        
        
        
        
        • 1

        信息

        ID
        202
        时间
        1000ms
        内存
        128MiB
        难度
        4
        标签
        递交数
        120
        已通过
        58
        上传者