PTA L3-004 肿瘤诊断 (30分)
第一次写博客。以后做出一些比较难的题目都会要求自己写篇博客记录一下,同时以供复习。
题意大概如下:
先上代码
#include<bits/stdc++.h>
using namespace std;
int a[75][150][1320]; //定义三维数组
int math(int i,int m,int n,int t)
{
int count=0;
if(a[i][m][n]==1){
a[i][m][n]=2; // 2表示已经被计算过,防止重复计算
count++; //遍历开始;
if(a[i][m+1][n]==1) { //三维数组一个个元素搜索过去
count+=math(i,m+1,n,t);a[i][m+1][n]==2; //6个if语句代表判断上下前后左右的元素
} //如果搜出来一个1
if(a[i][m-1][n]==1) { //就判断该元素的上下前后左右的元素是否是1
count+=math(i,m-1,n,t);a[i][m-1][n]==2; //如果上下前后左右元素中有一个是1
} //那么继续判断该元素相对应的上下前后左右的元素下
if(a[i][m][n+1]==1) { //直至停止
count+=math(i,m,n+1,t);a[i][m][n+1]==2; //count用来记录这些为1的元素的数量,之后与t作比较
}
if(a[i][m][n-1]==1) {
count+=math(i,m,n-1,t);a[i][m][n-1]==2;
}
if(a[i+1][m][n]==1) {
count+=math(i+1,m,n,t);a[i+1][m][n]==2;
}
if(a[i-1][m][n]==1) {
count+=math(i-1,m,n,t);a[i-1][m][n]==2;
} //这种方法就类似于“连锁反应”
} //只要揪出来一个等于1,那么他旁边的等于1的元素全跑不了
return count;
}
int main()
{
int m,n,l,t;
int count=0;
cin>>m>>n>>l>>t;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++){
scanf("%d",&a[i][j][k]); //按照题意输入
}
}
for(int i=1;i<=l;i++)
{
for(int j=1;j<=m;j++)
for(int k=1;k<=n;k++){
int tt=math(i,j,k,t); //tt存math函数的返回值
if(tt>=t) count+=tt; //tt>t才记录 (题意的条件)
}
}
printf("%d\n",count);
}
这就是深度优先搜索。遍历判断每一个元素并标记。
需要注意的是:
int tt=math(i,j,k,t);
if(tt>=t) count+=tt;
这两句不能直接用if(math(i,j,k,t)>=t) count+=math(i,j,k,t);
否则math函数会运算两遍,输出便变成了0。