目录
标识符:
以字母,下划线,$开头,由字母,下划线,$和数字组成,在java中严格区分大小写,标识符不包括空格。
数组:
其实java的数组开辟和c差不多,主要还是要注意new,下面是常见的两种错误,但是它编译时是不报错的,很容易被忽视。
类:
1,类的基本语法格式
2,类的属性
其实和c是一样的,只是要加一个修饰符。
3,类的方法
其实用我的话来讲的话,我觉得类的方法就是我在这个类中想要实现的东西,输入输出加减乘除什么的。
4,方法的重载和重写
在C语言里面函数名是不能一样的,所以这也算是一个要区别的点。
重载
重载(overloading) 是在一个类里面,方法名字相同,而参数类型或参数个数或参数顺序不同,返回类型可以相同也可以不同,每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
重写
子类重写父类的方法只是重写父类的方法体(就是大括号内的东西),其他的都不变。
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
对象
对象的创建及基本使用
形参传递
对于形参来讲,主要要理解的还是一个“形参是对象的传递”,我觉得有点像全局变量。
形参
形参是对象的传递
package
包和电脑中文件夹的概念差不多,可以说是一模一样。文件夹有的性质包也一样。
import
它其实就有点像声明,声明在这个包内可以用另一个包内的类。
权限修饰符
它就像c中的动态变量,静态变量那些东西,就是限制它的使用范围。
类的构造
要点:构造方法的名称一定于类名相同。
this和super
this表示是本类中的成员
super表示可以在子类中调用父类(或父类的父类,或父类的父类的父类)的成员变量和成员方法。
继承
它可以简写一些前面有过的东西,让程序显得不那么臃肿,要用到“extends”加上继承的类。
注意:一个子类只能有一个父类,但是一个父类可以有多个子类,而且是父类向子类单向传递。
instanceof操作符
object类
多层继承时,处于最高层的父类一定时Object类。
Object类中的主要方法
对象的类型转换(造型)
搜索类题目
分析:
它的意思就是说只要一个白色方块的一圈八个方块中有一个白色方块那它就可以连在一起,一个或者多个连在一起的白色方块组成一个交通要塞。
所以初步决定,要有一个搜索的函数,一个判断它的白色方块是否全都找完的函数。
对于搜索,我选择用深搜(反正数不大),一头扎进去找,只要满足白色方块的一圈八个方块中有一个白色方块,就把找到的这个白色方块给他变成黑色,然后继续找,直到在白色方块附近的八个方块内找不到白色方块就放弃。然后在主函数中调用一次深搜的函数就加一。
每找一次之后就判断整个地图内还有没有白色方块,没有了就不找了。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int m,n;
char a[105][105];
int sum;
int b[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{-1,1},{1,-1}};
void dfs(int x,int y)
{
for(int i=0;i<8;i++)
{
int tx=x+b[i][0];
int ty=y+b[i][1];
if(tx>=0&&tx<m&&ty>=0&&ty<n&&a[tx][ty]=='@')
{
a[tx][ty]='*';
dfs(tx,ty);
}
}
}
int main()
{
scanf("%d%d",&m,&n);
while(m)
{
sum=0;
for(int i=0;i<m;i++)
{
scanf("%s",a[i]);
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='@')
{
dfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
//for(int i=0;i<m;i++)
//puts(a[i]);
scanf("%d%d",&m,&n);
}
}
https://vjudge.net/contest/547627#problem/M
分析:
这个题需要注意的细节点真的好多,我写这个题的时候就一直改bug。
首先处理一下传送门的情况,如果它是传送门,它传送过去有三种情况,另一边可能是墙,可能可以走,可能也是传送门,那么首先对于另一边是墙的情况,那就直接把那个传送门处理成墙,省得后面还判断;如果另一边还是传送门那就把这两个传送门都处理成墙,省的传送过来传送过去。
然后就是一个普通的bfs,只是在搜索的时候,我们每走一步就还要加一个判断,我走了的这里是要标记的,那也就是说之后就不会再走了,那如果我走了的这里的另一边是传送门的话,传送过又走一次?所以这里是个坑,得填,当我走到了这里,我发现这里的另一边是传送门,那么这个两个地方都标记起来,就不走了。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int n,m,t;
char a[2][11][11];
int b[2][11][11];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct ff
{
int x;
int y;
int z;
int s;
}map[2*11*11];
void bfs()
{
int tail=1;
int head=1;
map[tail].x=0;
map[tail].y=0;
map[tail].z=0;
map[tail].s=0;
b[0][0][0]=1;
tail++;
while(head<tail)
{
for(int i=0;i<4;i++)
{
int ny,nz;
ny=map[head].y+d[i][0];
nz=map[head].z+d[i][1];
if(ny>=0&&ny<n&&nz>=0&&nz<m&&b[map[head].x][ny][nz]==0&&a[map[head].x][ny][nz]!='*')
{
map[tail].x=map[head].x;
map[tail].y=ny;
map[tail].z=nz;
map[tail].s=map[head].s+1;
b[map[head].x][ny][nz]=1;
tail++;
int xx=map[head].x;
if(xx==0)
xx=1;
else
xx=0;
if(a[xx][ny][nz]=='#')
b[xx][ny][nz]=1;
else if(b[xx][ny][nz]==0&&a[map[head].x][ny][nz]=='#')
{
if(map[head].x==0)
{
b[1][ny][nz]=1;
map[tail-1].x=1;
}
else if(map[head].x==1)
{
b[0][ny][nz]=1;
map[tail-1].x=0;
}
}
}
if(map[tail-1].s<=t&&a[map[tail-1].x][ny][nz]=='P')
{
printf("YES\n");
return;
}
if(map[tail-1].s>t)
{
printf("NO\n");
return;
}
}
head++;
}
printf("NO\n");
return;
}
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
scanf("%d%d%d",&n,&m,&t);
for(int i=0;i<2;i++)
for(int j=0;j<n;j++)
for(int k=0;k<m;k++)
b[i][j][k]=0;
for(int i=0;i<2;i++)
{
for(int j=0;j<n;j++)
{
scanf("%s",a[i][j]);
}
getchar();
}
for(int i=0;i<2;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<m;k++)
if(a[i][j][k]=='#')
{
if(i==0&&(a[1][j][k]=='*'||a[1][j][k]=='#'))
a[1][j][k]='*',a[i][j][k]='*';
else if(i==1&&(a[0][j][k]=='*'||a[0][j][k]=='#'))
a[0][j][k]='*',a[i][j][k]='*';
}
}
}
bfs();
}
}