有错误的欢迎指出
B题:
#include <iostream>
#include<map>
#include<algorithm>
using namespace std;
int main() {
map<int, int> fire; //这里采用<列,行>的顺序,因为map的count函数是对于键(即
//第一个元素而言的)
int T;
cin >> T;
int n = 0, max_left = 0, max_right = 0; //n是着火点个数,
//max_left和max_right指左右两边有效阻碍的着火点个数
int r, c; //r是行,c是列
int special=0;//记录特殊位置(1,-1),(1,1),(2,0)着火点的个数
int ans = 0;
while (T--)
{
cin >> n;
if (n == 0)
{
cout << 3 << endl;
continue;
}
while (n--)
{
cin >> r >> c;
//注意以下条件语句的比较运算符的区别
if (fire.count(c)) //因为着火点不会重复,所以只要找到则说明该列已经满了
{
if (c > 0)max_right = 2; //右边被完全封住,赋值为2
else if (c < 0)max_left = 2;//左边被完全封住
}
else if (fire.count(c - 1) && fire[c - 1] != r)
{
if (c > 0)max_right = 2;
else if (c <= 0)max_left = 2;
}
else if (fire.count(c + 1) && fire[c + 1] != r)
{
if(c>=0)max_right = 2;
else if (c <0)max_left = 2;
}
fire[c] = r;
if (c >= 0)max_right = max(1, max_right);
if (c <= 0)max_left = max(1, max_left);
if (c == 0)special++;
else if ((c == 1 || c == -1) && r == 1)special++;
}
ans = 4 - max_right - max_left;
ans = min(ans, 3 - special);
cout << ans << endl;
max_left = 0; //初始化为0别忘记
max_right = 0;
special = 0;
fire.clear();
}
return 0;
}

京公网安备 11010502036488号