有错误的欢迎指出

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;
}