题干:1128 N Queens Puzzle (20 分)
- 题解:昨天晚上做了很早以前去PAT超市买的一套仿真模拟卷,是2020年春季的,做了61分,后面凌晨2点冷的有点难受,就提前1小时交卷了。。。。做完以后我的感受很深,加上早上看到的一篇文章。。。。我现在觉得我这种复习的节奏基本上是合理的。。。今天早晨起来以后我调整了做题的策略
- 就是不再追求做题的速度和对考场环境的拟合程度,在剩下的几天里面就是继续全力去积累各种编程的技巧,以学习为主,到考试前能学多少就学多少
- 少说还有20天呢,其实我觉得吧,考试的最后冲刺的阶段真的很重要,怎么说呢?冲刺阶段的时候你的心态是调整的最好的,因为之前的话你基础不扎实的时候,做题很容易被打击信心,然后就会去做别事情,玩游戏啊,听英语啊,但是不服输的你还是坚持每天一点点的积累,到了一定的程度,你对自己越来越自信,就越来越爱学下去的,所以,冲刺的时候学习效率反而是最高的。。。。。
- 我这个题解用了unordered_map的一个进阶的技巧,但是整体的代码是比较拖沓的,但是比较容易想出来(相比满分答案。。。)我怀疑那个博主是不是有计算机图形学的相关编程经验,不然怎么会想到那么优雅的解法,原先听清华的数据结构公开课的时候有听老师讲过好像。。。。这些都不重要了。。。
- 我因为有学这个技巧,所以花费的时间远超考试要求,应该用了3个小时吧,而且还有一个数据点是超时的,最后拿了16分,做过那么多PAT的题库还有昨晚的仿真卷,我现在应该已经具备一定的能力去判断哪些题目是一场考试里面比较坑人的题了。。。这题明显就是。。。。
- 最后还是要提一下visual studio的重要性!!!!尤其是你有用map,vector这样的STL!!!一定记得要用vs考试和学习,应该随着线上考试的推进和举办,会有越来越多的考生慢慢认识到vs对做题的帮助到底有多大
-
// A1128.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <bits/stdc++.h> using namespace std; #define max 1000010 struct pos { int x; int y; }; class Hash { public: size_t operator()(const pos& c) const { return hash<int>()(c.x) * 10 + hash<int>()(c.y); } }; class Equal { public: bool operator()(const pos& t1, const pos& t2) const { return t1.x == t2.x && t1.y == t2.y; } }; int n; vector<pos> an; unordered_map<pos, bool,Hash,Equal> bn; bool up_east(int j) { int p = an[j].x; int q = an[j].y; for (; p >= 0 && q < n; p--, q++) { //bn.find({ p, q }) != bn.end() if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } bool east(int j) { int p = an[j].x; int q = an[j].y; for (;q < n;q++) { if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } bool south_east(int j) { int p = an[j].x; int q = an[j].y; for (; p < n &&q < n; p++, q++) { if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } bool south_west(int j) { int p = an[j].x; int q = an[j].y; for (; p < n && q>=0; p++, q--) { if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } bool west(int j) { int p = an[j].x; int q = an[j].y; for (;q >= 0;q--) { if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } bool north_west(int j) { int p = an[j].x; int q = an[j].y; for (; p >= 0 && q >= 0; p--, q--) { if (bn[{p, q}] == true) { if (p == an[j].x && q == an[j].y) { continue; } else { return false; } } } return true; } int main() { #ifndef ONLINE_JUDGE FILE* s; freopen_s(&s, "in.txt", "r", stdin); #endif // !ONLINE_JUDGE int k; cin >> k; for (int i = 0; i < k; i++) { cin >> n; an.clear(); bn.clear(); int t; for (int j = 0; j < n; j++) { cin >> t; an.push_back({ n - t,j }); //bn.insert(pair<pos, bool>({ n - t,j }, true)); bn[{ n - t, j }] = true; } bool flag = true; for (int j = 0; j < n; j++) { if (!up_east(j)|| !east(j)|| !south_east(j) || !south_west(j)|| !west(j)|| !north_west(j)) { flag = false; break; } } if (flag) { cout << "YES"; } else { cout << "NO"; } cout << endl; } return 0; }