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