您的位置:首页 > 编程语言 > Java开发

算法竞赛一些基础问题的复习(java) 2(开灯问题、蛇形填数、TEX、wertyu)

2017-01-30 21:53 423 查看
(这些是一个月前写的了,忘了发了。。。)网上搜了一下,完整整理这些题的貌似只有c的,我还是继续用java吧。

1.开灯问题。有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯 将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输 入n和k,输出开着的灯的编号。k≤n≤1000

static boolean[] a = new boolean[1005];//为了保险,设为1005,貌似java里!不能给int数组取反,所以new一个布尔数组
public static void main(String[] args) {
Arrays.fill(a,false);
int n, k, f = 1;// f为判断是否是第一个输出数据,在同行输出时,可不打印行头空格
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
k = sc.nextInt();
for (int i = 1; i <= k; i++) {//进来的人逐个循环
for (int j = 1; j <= n; j++) {//灯泡循环
4000

if (j % i == 0) {
a[j]=!a[j];//取反
}
}
}
for (int i = 1; i <= n; i++) {
if (a[i]) {
if (f == 1) {
f = 0;
} else {
System.out.printf(" ");
}
System.out.print(i);
}
}
}
//备忘另外java中赋值数组的方法:System.arraycopy(源数组, 复制源起始位置, 目标数组, 目标起始位置,复制长度)


2.蛇形填数。在n×n方阵里填入1,2,…,n×n,要求填成蛇形,n<=8。例如,n=4时方阵为:


int n, i, j, num;//输入数,行数,列数,填充数
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int a[][] = new int

;
for (i = 0; i < n; i++)
Arrays.fill(a[i], 0);//二维数组好像不能统一赋值,最少也得一个循环
num = a[i = 0][j = n - 1] = 1;//右上角的1
while (num < n * n) {
while (i + 1 < n && a[i + 1][j] == 0)//向下
a[++i][j] = ++num;
while (j - 1 >= 0 && a[i][j - 1] == 0)//向左
a[i][--j] = ++num;
while (i - 1 >= 0 && a[i - 1][j] == 0)//向上
a[--i][j] = ++num;
while (j + 1 < n && a[i][j + 1] == 0)//向右
a[i][++j] = ++num;
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(" " + a[i][j]);
}
System.out.println();
}


3.TeX中的引号(Tex Quotes, UVa 272)

在TeX中,左双引号是““”,右双引号是“””。输入一篇包含双引号的文章,你的任务是 把它转换成TeX的格式。

boolean is = true;//按顺序标识左右引号
Scanner sc = new Scanner(System.in);
String in = sc.nextLine();
char[] a = in.toCharArray();
for (int i = 0; i < in.length(); i++) {
if (a[i] == '"') {
if (is) {
a[i] = '”';
} else {
a[i] = '“';
}
is = !is;
System.out.print(a[i]);
} else
System.out.print(a[i]);
}
//这其实是一个并不完善的程序,因为它并不能解决输入的文本中存在回车的情况,至于怎么解决,我也不知道。。。


4.WERTYU(WERTYU, UVa10082)

把手放在键盘上时,稍不注意就会往右错一 位。这样,输入Q会变成输入W,输入J会变成输 入K等。

String r = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";//貌似常量数组是最简单的方法了。。
char[] right=r.toCharArray();//转化成常量数组
Scanner sc = new Scanner(System.in);
char[] w=sc.nextLine().toCharArray();
for (int i = 0; i < w.length; i++) {
for(int j=0;j<right.length;j++){
if (w[i] == right[j]) {System.out.print(right[j-1]);break;}//输出该字符在正确数组里的前一位
else if(w[i] == ' ') {System.out.print(' ');break;}//出现的空格情况
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: