2008B Square or Not

思路:

1、先判断是否为平方数;
2、遍历正方形,计算(i,j)所对应在 str 中的下标,判断正方形边缘是否为1,内部是否为0。

#include <iostream>
#include<cmath>

using  namespace std;

bool isPerfectSquare(long long num) {
    if (num < 0) return false;  // 负数不是平方数
    long long sqrtNum = sqrt(num);  // 计算整数平方根
    return sqrtNum * sqrtNum == num;  // 检查平方是否等于原数
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x;
        string str;
        cin >> x;
        cin >> str;
        if (isPerfectSquare(x)) {
            int sqrtNum = sqrt(x);
            bool flag = true;
            for (int j = 0; j < sqrtNum; ++j) {
                for (int k = 0; k < sqrtNum; ++k) {
                    int index = j * sqrtNum + k;
                    if (j == 0 || k == 0 || j == sqrtNum - 1 || k == sqrtNum - 1) {
                        if (str[index] != '1') {
                            flag = false;
                        } 
                    } else {
                        if (str[index] != '0') {
                            flag = false;
                        }
                    }
                }
            }
            if (flag) {
                cout << "Yes" << endl; 
            } else {
                cout << "No" << endl;
            }
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}