写给自己,也写给大家:把搜过的每一道题弄明白,别欺骗自己,也别辜负自己
问题描述
解题思路及注意点
拿到这道题,在不会任何容器的使用下,我们首先应考虑到用结构体来表示每个位置处的垃圾,用结构体数组来表示n个位置处的垃圾。
其次考虑用结构体表示的垃圾其中应该包含哪些内容:根据题目可以确定必须要包括垃圾的位置坐标,那么还有什么?题目让我们在满足前两个条件下去统计对角线上垃圾分别为0、1、2、3、4的垃圾的个数,所以我们可以在结构体中设置一个布尔值表示该处的垃圾是否上下左右全为垃圾,以及一个来表示对角线垃圾的个数的变量。
接着要考虑如何来判断上下左右全为垃圾(把要判断的坐标和我们输入的值进行一一比较),如何来统计对角线垃圾的个数
关键代码
- 定义的结构体
struct node{
int x,y; //定义垃圾的坐标
bool flag; //定义该垃圾上下左右若全有垃圾则为 true,否则为false
int z; //定义该垃圾对角线上有几个垃圾
};
- 判断上下左右全为垃圾的函数
//判断某点处是否有垃圾
bool have(int x,int y,node n1[],int n){ //传入结构体数组和其大小 ,要进行判断的坐标
for(int i=0;i<n;i++){ //遍历结构体数组,若某个node的x和y和我们传入的相等,返回true
if(n1[i].x==x&&n1[i].y==y){
return true;
}
}
return false; //若我们要判断的坐标结构体数组中并没有,则返回false
}
- 统计对角线垃圾的个数
for(int i=0;i<n;i++){ //对于flag为true位置处的垃圾进行统计对角线处垃圾的个数
nodes[i].z=0;
if(nodes[i].flag){
if(have(nodes[i].x-1,nodes[i].y-1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x-1,nodes[i].y+1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x+1,nodes[i].y-1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x+1,nodes[i].y+1,nodes,n))
nodes[i].z++;
}
}
完整代码
#include<iostream>
using namespace std;
struct node{
int x,y; //定义垃圾的坐标
bool flag; //定义该垃圾上下左右若全有垃圾则为 true,否则为false
int z; //定义该垃圾对角线上有几个垃圾
};
//判断某点处是否有垃圾
bool have(int x,int y,node n1[],int n){ //传入结构体数组和其大小 ,要进行判断的坐标
for(int i=0;i<n;i++){ //遍历结构体数组,若某个node的x和y和我们传入的相等,返回true
if(n1[i].x==x&&n1[i].y==y){
return true;
}
}
return false; //若我们要判断的坐标结构体数组中并没有,则返回false
}
int main(){
int n; //n代表n个垃圾位置
cin>>n;
node nodes[n]; //用结构体数组来表示每个位置处垃圾的属性(坐标,上下左右是否全为垃圾,对角线的垃圾个数)
for(int i=0;i<n;i++){
cin>>nodes[i].x>>nodes[i].y;
}
for(int i=0;i<n;i++){ //对每个位置处的坐标进行判断其上下左右是否全为垃圾,是的话该位置处的垃圾flag为true
nodes[i].flag=false;
if(have(nodes[i].x-1,nodes[i].y,nodes,n)&&have(nodes[i].x+1,nodes[i].y,nodes,n)&&have(nodes[i].x,nodes[i].y-1,nodes,n)&&have(nodes[i].x,nodes[i].y+1,nodes,n))
nodes[i].flag=true;
}
for(int i=0;i<n;i++){ //对于flag为true位置处的垃圾进行统计对角线处垃圾的个数
nodes[i].z=0;
if(nodes[i].flag){
if(have(nodes[i].x-1,nodes[i].y-1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x-1,nodes[i].y+1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x+1,nodes[i].y-1,nodes,n))
nodes[i].z++;
if(have(nodes[i].x+1,nodes[i].y+1,nodes,n))
nodes[i].z++;
}
}
int zero=0,one=0,two=0,three=0,four=0;
for(int i=0;i<n;i++){ //统计对角线垃圾个数分别为0、1、2、3、4的垃圾个数
if(nodes[i].flag){
switch(nodes[i].z){
case 0:
zero++;
break;
case 1:
one++;
break;
case 2:
two++;
break;
case 3:
three++;
break;
case 4:
four++;
break;
}
}
}
cout<<zero<<endl;
cout<<one<<endl;
cout<<two<<endl;
cout<<three<<endl;
cout<<four;
return 0;
}
//测试用例1:
//7
//1 2
//2 1
//0 0
//1 1
//1 0
//2 0
//0 1
//测试用例2:
//2
//0 0
//-100000 10
//测试用例3:
//11
//9 10
//10 10
//11 10
//12 10
//13 10
//11 9
//11 8
//12 9
//10 9
//10 11
//12 11
因孤独而沉寂,因沉寂而伟大