2 条题解
-
5
em... 肿木说捏??
这道题目,,的确只是考察了搜索,具体思路如下(本来是和某位dalao@ 一行 (2023liangweilin) 讨论的时候写的,这里由于
lan,直接复制 粘贴大家么意见吧?!QAQ):- 如果地图某一点不为0(分为两种情况:1.本身是树 2.已经搜索过)进行搜索,方向:上/下/左/右(注意不要超出边界)
#include<cstdio> using namespace std; char tent[1000]; int map[1001][1001]; //存储地图数据 int n, m; void findx(int x, int y){ //搜索函数 if(!map[x][y]) return ; map[x][y] = 0; //对于此点 上/下/左/右 方向进行搜索(不能越界,注意判断条件) if(x > 1) findx(x-1, y); if(y > 1) findx(x, y-1); if(x < n) findx(x+1, y); if(y < m) findx(x, y+1); //这里草率了awa,感谢 一行 的指正~~ return ; } int main(){ scanf("%d%d", &n, &m); for(int i=1; i<=n; i++){ scanf("%s", tent); for(int j=1; j<=m; j++){ map[i][j] = tent[j-1]-'0'; //由于题目奇奇怪怪的输入方式,这里只能这样存。。。 } } int c=0; //存储 猴群数 for(int i=1; i<=n; i++){ for(int j=1; j<=m; j++){ if(map[i][j]){ //地图当前点不为0 findx(i, j); //从当前点开始遍历查找 c++; //猴群数 自增1 } } } printf("%d\n", c); return 0; }
END~
-
-2
血泪教训: 本题的数据是在windows下生成的,而评测系统却是Linux,两者在字符的处理上有些许不同,例如换行处理上。 我原本使用getchar(),由于上述原因无法通过,可以将矩阵的每行看成一个字符串,循环行数次,读入字符串暂时存储到字符数组里,这样就省了换行的处理,然后对字符串遍历,再对每个字符进行判断,最后再将信息转存到二维表里
#include<iostream> #include<cstring> using namespace std; const int fx[10]={0,-1,1,0,0}; const int fy[10]={0,0,0,1,-1}; bool maps[1001][1001]; char s [1001]; int a[3][100001]; int m,n; int sum=0; void bfs(int,int); int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { scanf("%s",s); for(int j=0;j<=n-1;j++) { if(s[j]!='0') maps[i][j+1]=1; } } for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { if(maps[i][j]) { sum++; bfs(i,j); } } } printf("%d",sum); return 0; } void bfs(int x,int y) { int head=0; int tail=1; a[1][1]=x; a[2][1]=y; maps[x][y]=0; do { head++; for(int i=1;i<=4;i++) { if(maps[a[1][head]+fx[i]][a[2][head]+fy[i]]!=0&&a[1][head]+fx[i]>=1&&a[1][head]+fx[i]<=m&&a[2][head]+fy[i]>=1&&a[2][head]+fy[i]<=n) { tail++; a[1][tail]=a[1][head]+fx[i]; a[2][tail]=a[2][head]+fy[i]; maps[a[1][tail]][a[2][tail]]=0; } } }while(head<tail); }
- 1
信息
- ID
- 1566
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 95
- 已通过
- 19
- 上传者