A1128 N Queens Puzzle (20 分| 简单逻辑,附详细注释,逻辑分析)

写在前面

  • 思路分析
    • 给出1个皇后图:1个数组包含n个数字,每个数字表示该列的皇后所在的行数
    • 判断给出的皇后图是否满足不会互相攻击
      • 任意两个皇后不在同1行或同1列,且不在斜对角线上
    • 具体实现:
      • 用v[n]存储1张图给出的数字
      • 对于第j个数字,判断前0~j-1个数字中是否有在同1行v[j]== v[t]和在斜对角线(等腰三角形)上abs(v[j]-v[t]) == abs(j-t)
      • 已告诉肯定不在同1列,所以不需要判断是否在同1列
      • 存在不满足情况,将result由true标记为false
      • 根据result是true还是false输出对应YES、NO
  • 理解题意,条件转化
    • 学习ing

测试用例

  • input:
    4
    8 4 6 8 2 7 1 3 5
    9 4 6 7 2 8 1 9 5 3
    6 1 5 2 6 4 3
    5 1 3 5 2 4
    output:
    YES
    NO
    NO
    YES
    

ac代码

  • #include 
    #include 
    #include 
    using namespace std;
    int main()
    {
        int k, n;
        cin >> k;
        for (int i = 0; i < k; i++)
        {
            scanf("%d", &n);
            vector<int> v(n);
            bool result = true;
            for (int j = 0; j < n; j++)
            {
                scanf("%d", &v[j]);
                for (int t = 0; t < j; t++)
                {
                    // 是否存在同行、对角线输入(等腰三角形)
                    if (v[j] == v[t] || abs(v[j]-v[t]) == abs(j-t))
                    {
                        result = false;
                        break;
                    }
                }
            }
            // 打印当前行判断结果
            cout << (result == true ? "YES\n" : "NO\n");
        }
        return 0;
    }
    

你可能感兴趣的:(PAT(甲级),算法比赛相关)