第二次比赛部分题解

ouhq / 2023-07-23 / 原文

  • P7060 [NWRRC2014] Alarm Clock

  

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    int arr[10]={6,2,5,5,4,5,6,3,7,6};
    bool check= false;
    //对于时间ab:cd
    for(int a=0;a<=2;a++){  //a最多可以到2(因为最大为23小时)
        for(int b=0;b<10;b++){ //b0到9都有可能(10:00到19:00)
            for(int c=0;c<=5;c++){//分钟最多到59,所以c位最大位5
                for(int d=0;d<10;d++){//最后一位0-9都有可能
                    if(arr[a]+arr[b]+arr[c]+arr[d]==n){  //遍历所有,第一个满足的输出
                        cout<<a<<b<<":"<<c<<d;
                        check= true; //如果输出了答案,那么就不输出impossible
                        break;  //只能跳出当前循环,因此需要多个break
                    }
                }
                if(check) break;
            }
            if(check)break;
        }
        if(check) break;
    }
    if(!check) cout<<"Impossible";  //如果没有符合条件的,那么输出impossible
    return 0;
}
  • P1451 求细胞数量

  

#include <bits/stdc++.h>
using namespace std;
int n,m;
int cell[105][105]; //记录细胞
bool vis[105][105]; //标记位置
int ans=0;

int main() {
    cin>>n>>m;
    for(int i=0;i<n;i++){
        string str;  //输入的数字没有空格隔开,不能用int型来存,否则一行会被认为是一个数字。
        cin>>str; //读入当前行字符串
        for(int j=0;j<m;j++){
            cell[i][j]=str[j]-'0';  //读入字符串之后再把每个数字拆开,存放到int数组中(char数组也行)
        }
    }
    queue< pair<int,int> > que;  //队列中每个元素都是pair,每个元素都存放两个int数据.
    for(int i=0;i<n;i++){  //从头开始遍历cell
        for(int j=0;j<m;j++){
            if(vis[i][j]==1||cell[i][j]==0) continue;  //如果当前的cell被标记过,或者当前的cell不是细胞,直接进行下一次循环
            if(vis[i][j]==0&&cell[i][j]!=0){  //如果当前位置的cell是细胞,而且没有被标记过,那么入列
                que.emplace(i,j); //这里是位置入列,因为我们需要从这个位置,延申到上下左右的位置。如果是把cell存放的数字入列,则不能找到该cell上下左右是否还是cell
                ans++; //答案加一     因为和这个位置有关的细胞,都被视为一个细胞
            }
            while(que.size()){  //如果队列里面还有细胞(不为0的数据)的话,就一直延申,一直查找,一直标记这个被视为一个细胞的细胞。直到0把这个细胞都分割开,不再有数据能入列,那么这个细胞的
                pair<int,int> top;
                top=que.front(); //把队首存放的坐标(cell的坐标)取出,存放到top;
                que.pop();//把队首出列
                //下列的4个if就是判断现在这个这个细胞(不为0的元素)的上下左右方向是否是细胞,是否没有被标记过
                if( top.first+1<n && cell[top.first+1][top.second]!=0 && vis[top.first+1][top.second]==0){  //首先判断这个方向的位置是否在范围之内,然后判断是否数据为0,是否被标记过
                    que.emplace(top.first+1,top.second);//如果这个细胞(不为0的数据)在范围之内,而且数据不为0,而且没有被标记过,那么这个细胞的位置要入列,需要通过这个细胞的位置延申下去
                    vis[top.first+1][top.second]=1;//入列之后标记,避免重复延申
                }
                if( top.first-1>=0 && cell[top.first-1][top.second]!=0 && vis[top.first-1][top.second]==0){
                    que.emplace(top.first-1,top.second);
                    vis[top.first-1][top.second]=1;
                }
                if( top.second-1>=0 && cell[top.first][top.second-1]!=0 && vis[top.first][top.second-1]==0){
                    que.emplace(top.first,top.second-1);
                    vis[top.first][top.second-1]=1;
                }
                if( top.second+1<m && cell[top.first][top.second+1]!=0 && vis[top.first][top.second+1]==0){
                    que.emplace(top.first,top.second+1);
                    vis[top.first][top.second+1]=1;
                }
            }//当这个while循环结束,意味着这个细胞已经延申完了,最外层的循环接着遍历这个cell里面的数据,查看是否还有没有被标记的不为0的数据
        }
    }
    cout<<ans;
    return 0;
}
  •