4 条题解
-
2
#include<bits/stdc++.h> using namespace std; const int N=110; char g[N][N],bg[N][N]; int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>g[i]; int m; cin>>m; m--; while(m--) { memcpy(bg,g,sizeof g); //等价于bg=g for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(g[i][j]!='@') continue; //没有感染 for(int k=0;k<4;k++) //枚举周围4个点 { int a=i+dx[k],b=j+dy[k]; if(a<0||a>=n||b<0||b>=n) //越界 continue; if(bg[a][b]=='#') //空白 continue; bg[a][b]='@'; //感染 } } } memcpy(g,bg,sizeof bg); //将第i天当成第i+1天的前一天 } int cnt=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) { if(g[i][j]=='@') cnt++; } cout<<cnt; return 0; }
-
1
这段代码的主要目的是模拟一个网格状的宿舍区,其中每个房间可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感。最后输出第m天得流感的人数。
代码解释:
- 首先定义了一个二维字符数组g[N][N]来存储宿舍区的初始状态,其中'.'表示健康的人,'#'表示空着的房间,'@'表示第一天该房间住着得流感的人。
- 然后定义了一个二维字符数组bg[N][N]来存储每一天宿舍区的状态,用于计算下一天的状态。
- 定义了两个一维数组dx[]和dy[],分别表示上下左右四个方向的偏移量。
- 在main函数中,首先读取宿舍区的行数n,然后读取n行输入,将输入存储到数组g中。
- 接着读取天数a,然后将a减1,因为题目中的天数是从0开始计数的。
- 使用while循环,每次循环代表一天。在循环中,首先将当前状态复制到bg中,然后遍历每一个房间,如果房间中有得流感的人,就将其邻居的房间标记为得流感的人。
- 最后,将bg中的状态复制回g中,进行下一天的计算。
- 当所有的天数都计算完毕后,再次遍历g,统计得流感的人数,并输出结果。
代码:
#include<bits/stdc++.h> using namespace std; const int N=110; char g[N][N],bg[N][N]; int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int main() { int n; cin>>n; for(int i=0;i<n;i++){ cin>>g[i]; } int a; cin>>a; a--; while(a--){ memcpy(bg,g,sizeof g); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(g[i][j]!='@'){ continue; } for(int k=0;k<4;k++){ int m=dx[k]+i,b=dy[k]+j; if(m<0||m>=n||b<0||b>=n){ continue; } if(bg[m][b]=='#'){ continue; } bg[m][b]='@'; } } } memcpy(g,bg,sizeof bg); } int cnt=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(g[i][j]=='@'){ cnt++; } } } cout<<cnt; return 0; }
-
-1
#include<bits/stdc++.h> using namespace std; const int N=110; char g[N][N],bg[N][N]; int dx[]={-1,1,0,0},dy[]={0,0,-1,1}; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>g[i]; } int m; cin>>m; m--; while(m--) { memcpy(bg,g,sizeof g); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(g[i][j]!='@') { continue; } for(int k=0;k<4;k++) { int a=i+dx[k],b=j+dy[k]; if(a<0||a>=n||b<0||b>=n) { continue; } if(bg[a][b]=='#') { continue; } bg[a][b]='@'; } } } memcpy(g,bg,sizeof bg); } int cnt=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(g[i][j]=='@') { cnt++; } } } cout<<cnt; return 0; }
- 1
信息
- ID
- 1429
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 36
- 已通过
- 7
- 上传者