目录
Java
缓冲字符流
输入
输出
转换流
输入
输出
对象流
随机存储流
class类
OJU
简单搜索&&进阶搜索 - Virtual Judge
简单搜索&&进阶搜索 - Virtual Judge
简单搜索&&进阶搜索 - Virtual Judge
atc
E - 2xN Grid
cf
Problem - E - Codeforces
Problem - G1 - Codeforces
从计算机内部读文件到屏幕上。
import java.io.*;public class Test2 {public static void main(String[] args) {try {Test2.hczfsr();} catch (IOException e) {throw new RuntimeException(e);}}public static void hczfsr() throws IOException {FileReader r=new FileReader("D:\IDEA\java11\");BufferedReader br=new BufferedReader(r);char[] c=new char[100];int len=0;while((len= br.read(c))!=-1){System.out.println(new String(c,0,len));}br.close();r.close();}
}
主要代码:
创建一个文件字符流的参数,读取文件中的字符。
FileReader r=new FileReader("D:\IDEA\java11\");
缓冲字符的输入流,这个里面放FileReader的参数,表示缓冲这个文件中的字符。
BufferedReader br=new BufferedReader(r);
从屏幕上写到计算机内部。
import java.io.*;public class Test2 {public static void main(String[] args) {try {Test2.hczfsc();} catch (IOException e) {throw new RuntimeException(e);}}public static void hczfsc() throws IOException {FileWriter fw=new FileWriter("D:\IDEA\java11\");BufferedWriter bw= new BufferedWriter(fw);String s="wcbwcbwcb";bw.write(s);bw.flush();bw.close();fw.close();}
}
主要代码:
创建一个参数,表示要新建的一个文件,也就是我之后要写入的文件。
FileWriter fw=new FileWriter("D:\IDEA\java11\");
缓冲字符的输入流,参数放我要写入的文件。
BufferedWriter bw= new BufferedWriter(fw);
定义一个字符串,是我将要写入文件的字符。
String s="wcbwcbwcb";
bw.write(s);//写入bw.flush();//刷新到硬盘bw.close();//关闭fw.close();//关闭,从后往前依次关闭
import java.io.*;public class Test2 {public static void main(String[] args) {try {Test2.zhsr();} catch (Exception e) {throw new RuntimeException(e);}}public static void zhsr()throws Exception{FileInputStream fs=new FileInputStream("D:\IDEA\java11\TT4.TXT");InputStreamReader in=new InputStreamReader(fs,"UTF-8");char[] c=new char[100];int len=0;while((lenad(c))!=-1){System.out.println(new String(c,0,len));}in.close();fs.close();}
}
主要代码:
建立一个输入流
FileInputStream fs=new FileInputStream("D:\IDEA\java11\TT4.TXT");
把字节流转换为字符流(UTF-8是中文编码),放置的参数分为两个,第一个是要输入的文件,第二个是使用的编码。
InputStreamReader in=new InputStreamReader(fs,"UTF-8");
import java.io.*;public class Test2 {public static void main(String[] args) {try {Test2.zhsr();} catch (Exception e) {throw new RuntimeException(e);}}public static void zhsr()throws Exception{FileOutputStream fs=new FileOutputStream("D:\IDEA\java11\TT4.TXT");OutputStreamWriter out=new OutputStreamWriter(fs,"UTF-8");out.write("郭皓怡");out.flush();out.close();fs.close();}
}
主要代码:
建立一个输出流,放置要输出的文件。
FileOutputStream fs=new FileOutputStream("D:\IDEA\java11\TT4.TXT");
确定编码格式
OutputStreamWriter out=new OutputStreamWriter(fs,"UTF-8");
要记得刷新。
序列化和反序列化的示例代码:
import java.io.*;public class Test2 {public static void main(String[] args){try {Deserialize();} catch (IOException e) {throw new RuntimeException(e);} catch (ClassNotFoundException e) {throw new RuntimeException(e);}}public static void testSerialize() throws IOException {ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("D:\IDEA\java11\tt.txt"));Person p=new Person();p.name="zhangsan";p.age=11;out.writeObject(p);out.flush();out.close();}public static void textDeserialize() throws IOException, ClassNotFoundException {ObjectInputStream in=new ObjectInputStream(new FileInputStream("D:\IDEA\java11\TT.TXT"));Object objadObject();Person p=(Person)obj;System.out.println(p.name);System.out.println(p.age);in.close();}}
注意:对象的序列化和反序列化使用的类要严格一致,包名、类名、类结构等等所有都要一致。
示例代码如下:
import java.io.*;public class Test2 {public static void main(String[] args) {try {stRandomAccessFileRead();} catch (IOException e) {throw new RuntimeException(e);}}public static void testRandomAccessFileRead() throws IOException {RandomAccessFile ra=new RandomAccessFile("D:\IDEA\java11\","r");ra.seek(6);byte[] b=new byte[1024];int len=0;while((lenad(b))!=-1){System.out.println(new String(b,0,len));}ra.close();}
}
主要代码如下:
两个参数,文件路径和读取方式。
RandomAccessFile ra=new RandomAccessFile("D:\IDEA\java11\","r");
随机读取的关键,参数是确定读取(写入)的起始位置。
ra.seek(6);
附加:
把写入的追加在最后面。
前言
因为我是职高生,所以用了三四年C语言了,就一直不是很有欲望从C语言转成C++,但是!!!C++真的香,方便很多,就突然觉得C++也不是不可以,特别是最近接触了状压dp和优先队列之后,那是香了,就算是用在bfs里面也香啊。
分析:
这个题我刚开始看见的时候,奇奇怪怪有点懵,然后写了一遍,果然时间超限。。。。。。
进入正题
反转一个位置,它周围的四个格子也会跟着反转,那也就是说我想让一个格子反转,我最多有5种方法,那比下来数量是很大的,肯定会时间超限,所以这个时候有一个新的想法,先把第一行全部至于0的情况有多少种,找出最少的,然后再用第三行去反转第二行,第四行去反转第三行,依次反转,直至最后一行,如果发现最后一行依旧有没有被反转的1,那就输出“IMPOSSIBLE”,如果都反转完了,那就输出最少的需要反转的二维的格子。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int m,n,sum=1e9+7;
int b[5][2]={{0,0},{0,-1},{0,1},{-1,0},{1,0}};
int a[16][16],c[16][16],d[16][16];int cz(int x, int y)
{int k = a[x][y]; for(int i=0; i<5; i++){int nx = x + b[i][0];int ny = y + b[i][1];if(nx>=0 && nx<m && ny>=0 && ny<n){k += c[nx][ny];}}return k % 2;
}int ss()
{for(int i=1; i<m; i++){ for(int j=0; j<n; j++){ if(cz(i-1, j) == 1){ c[i][j] = 1;}}}for(int j=0; j<n; j++){if(cz(m-1, j) == 1) return -1; }int ct = 0;for(int i=0; i<m; i++){for(int j=0; j<n; j++){ct += c[i][j];}}return ct;
}void solve()
{for(int i=0; i<(1<<m); i++){ for(int j=0;j<m;j++)for(int k=0;k<n;k++)c[j][k]=0;for(int j=0; j<n; j++){c[0][j] = (i>>j) & 1; }int s = ss(); if(s>=0&&(s<sum)){sum = s;for(int j=0;j<m;j++)for(int k=0;k<n;k++)d[j][k]=c[j][k];}}if(sum == 1e9+7) printf("IMPOSSIBLE");else {for(int i=0; i<m; i++){for(int j=0; j<n; j++){printf("%d ", d[i][j]);}printf("n");}}
}int main()
{scanf("%d%d",&m,&n);for(int i=0;i<m;i++)for(int j=0;j<n;j++)scanf("%d",&a[i][j]);solve();//for(int i=0;i<m;i++)//for(int j=0;j<n;j++)//printf("%d",c[i][j]);
}
分析:
这个题目我是打算用深搜的,但是果不其然,超了,那没有办法我只有重操旧业,选择了时间复杂度和空间复杂度都中规中矩的IDA*算法,IDA*算法是A*算法和迭代加深算法的结合,迭代加深算法是在dfs搜索算法的基础上逐步加深搜索的深度,它避免了广度优先搜索占用搜索空间太大的缺点,也减少了深度优先搜索的盲目性。它主要是在递归搜索函数的开头判断当前搜索的深度是否大于预定义的最大搜索深度,如果大于,就退出这一层的搜索,如果不大于,就继续进行搜索。这样最终获得的解必然是最优解。
代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
int n;
char a[10][6];
int min;
char s[4]={'A','C','G','T'};
int l1[20];//字符串的长度
int l2[20];//子串在母串中匹配到的位置int get()
{int max=0;for(int i=1;i<=n;i++){max=max>(l1[i]-l2[i])?max:(l1[i]-l2[i]);}return max;
}int dfs(int bs)
{if(bs+get()>min)return 0;if(!get())return 1;int l22[20];for(int i=0;i<20;i++)l22[i]=l2[i];for(int i=0;i<4;i++){int k=0;for(int j=1;j<=n;j++){if(a[j][l2[j]]==s[i])k=1,l2[j]++;}if(k){if(dfs(bs+1))return 1;for(int kk=0;kk<20;kk++)l2[kk]=l22[kk];}}return 0;
}void idax()
{while(!dfs(0))min++;
}int main()
{int t;scanf("%d",&t);while(t--){for(int i=0;i<20;i++){l1[i]=0;l2[i]=0;}scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",a[i]);l1[i]=strlen(a[i]);}idax();printf("%dn",min);min=0;}
}
分析:
这个题呢?我其实是很熟悉的,因为我进实验室写的那个连我自己都看不下去的项目就是九宫格,所以我非常清楚它的寻址方法,因为我之前的那个项目里面我就是用的IDA*算法,所以我想试一下A*算法,我开始是用c++写的,但是它一直编译出错,我后来就是用c写的,A*算法它是基于bfs的,所以它是以bfs为基础,进阶的一个搜索。
然后在这个题里面它加了一个记录,记录走过的路径,还有就是康拓。
这里就是康托的那部分,康托展开的实质是计算当前排列在所有由小到大全排列中的顺序。
康拓最主要的还是这个公式。
代码如下:
#include<stdio.h>
#include<string.h>
#define M 400000
char s[10]="12345678x";
char c;
char e[10],f[50];
char u[10]={'u','d','l','r'};
char ans[M][40],pos[200];
int bfg[M];
int d[4]= {3,-3,1,-1};
int dk[10];
struct node
{char a[40],b[10],x;
} p[M];void swap(char s[],int x,int y)
{char t=s[x];s[x]=s[y];s[y]=t;
}void fz(char s1[],char s2[])
{int n=strlen(s2),i;for(i=0; i<n; i++)s1[i]=s2[i];s1[i]='