重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
import java.util.Scanner;
创新互联公司网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了网站制作、成都网站制作,成都网站设计,1元广告,成都做网站选创新互联公司,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。
public class CountInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字个数:");
int n = scanner.nextInt();
int zero = 0;
int plus = 0;
for (int i = 1; i = n; i++) {
System.out.printf("请输入第%d个数字:\n", i);
int m = scanner.nextInt();
if (m == 0) {
zero++;
} else if (m 0) {
plus++;
}
}
System.out.printf("总共输入%d个数字,其中正数%d个,零%d个,负数%d个\n", n, plus, zero, n - plus - zero);
}
}
因为java是忽略人为输入的空行的,即使你敲进去再多的Enter键,输出来也是一行,你可以用pre预格式文本来固定你要输出的格式,这时你写什么就会输出什么,比较方便输出代码。\n是特殊字符,当输出到\n时就会换行,所以你写的只在\n时换行,中间没有空行
第一题
import java.util.Scanner;
public class First
{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
System.out.println("请输入一个数字");
int n=in.nextInt();
System.out.println(n+"的阶乘是:"+factorial(n));
}
public static int factorial(int m)
{
if(m==1)
return(1);
else
return(factorial(m-1)*m);
}
}
第二题
import java.util.Scanner;
public class Second
{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
System.out.println("请输入圆的半径:");
double R=in.nextDouble();
yuan g=new yuan(R);
System.out.println("圆的周长是:"+g.perimeter());
System.out.println("圆的面积是:"+g.area());
System.out.println("请输入正方形的边长:");
double B=in.nextDouble();
zhengfangxing z=new zhengfangxing(B);
System.out.println("正方形的周长是:"+z.perimeter());
System.out.println("正方形的面积是:"+z.area());
}
}
class yuan extends shape
{
final double PI=3.1415926;
double r,area,perimeter;
public yuan(double R)
{
r=R;
}
public double area()
{
area=PI*Math.pow(r,2.0);
return area;
}
public double perimeter()
{
perimeter=2*PI*r;
return perimeter;
}
}
class zhengfangxing extends shape
{
double l,area,perimeter;
public zhengfangxing(double L)
{
l=L;
}
public double area()
{
area=l*l;
return area;
}
public double perimeter()
{
perimeter=4*l;
return perimeter;
}
}
abstract class shape
{
public abstract double area();
public abstract double perimeter();
}
boolean[] diagonal = new boolean[16]; // 对角线安全标志
boolean[] undiagonal = new boolean[16]; // 反对角线安全标志
用上两个判断是否能放置棋子
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后。
若两个皇后位于同一行、同一列、同一对角线上,
则称为它们为互相攻击。
n皇后问题是指找到这 n 个皇后的互不攻击的布局。
n 行 n 列的棋盘上,主次对角线各有2n-1条。
利用行号i和列号j计算
主对角线编号k的方法是k = n+i-j-1;
计算次对角线编号k的方法是k = i+j
你主要是算法有些模糊罢了,现在我怕我说的不好将你弄的越来越混乱所以给你个叫形象的若是还不明白,call me
package 百度;
//演示程序:n个皇后问题
import java.io.*;
/*
在 n 行 n 列的国际象棋棋盘上,最多可布n个皇后。
若两个皇后位于同一行、同一列、同一对角线上,
则称为它们为互相攻击。
n皇后问题是指找到这 n 个皇后的互不攻击的布局。
n 行 n 列的棋盘上,主次对角线各有2n-1条。
利用行号i和列号j计算
主对角线编号k的方法是k = n+i-j-1;
计算次对角线编号k的方法是k = i+j
*/
//"n个皇后问题"之类定义
public class cQueen {
int n; //皇后问题的大小
int col[]; //数组,各列上有无皇后(0,1)
int md[]; //数组,各主对角线有无皇后(0,1)
int sd[]; //数组,各次对角线有无皇后(0,1)
int q[]; //数组,第i行上皇后在第几列(0,n-1)
int Q; //已布皇后数,计数
int r; //n皇后问题的解的组数
//构造函数 n皇后问题的初始化
public cQueen(int m) {
n=m;Q=0;r=0;
col=new int[n];
md=new int[2*n-1]; //初始化0
sd=new int[2*n-1];
q=new int[n];
}
//函数:打印棋盘
public void showBoard() {
int i,j;
for(i=0;in;i++) {
for(j=0;jn;j++)
if(q[i]==j) System.out.print("1 ");
else System.out.print("0 ");
System.out.println();
}
r++; //解的组数
System.out.println("---------------");
}
//求解n皇后问题
/*
此函数试图在n*n的棋盘的第i行上放一个皇后,
若找到可以放的位置,就递归调用自身试图在i+1行
放另一个皇后,若第i行是最后一行,则打印棋盘。
*/
public void resolve(int i) {
int j;
// 在第i行给定后检查棋盘上的每一列
for(j=0;jn;j++) {
//如果在第i行的第j列可以布放皇后
if(col[j]==0md[n+i-j-1]==0sd[i+j]==0){
Q++;q[i]=j; //布放皇后,第i行皇后在第几列
// 标记新布皇后的攻击范围
col[j]=md[n+i-j-1]=sd[i+j]=1;
// 如果已经布了n个皇后(得到了一组解),
// 把棋盘(解)打印出来。
if(Q==n) showBoard();
// 否则,递归。在第i行第j列布放皇后的前提下,
//试探下一行(i+1行)在哪一列布皇后?
else if(in-1) resolve(i+1);
else resolve(0); //因为约定起始行可以任选
//移除在第i行的第j列新布的皇后,
//并消除所标记的攻击范围,为回溯作准备。
Q--; q[i]=0;
col[j]=md[n+i-j-1]=sd[i+j]=0;
//试探在第i行的第j+1列新布皇后的方案(新解)
}
} //下一列,j循环
//对于给定的行,列扫描完毕后,从这里回溯。
}
//输出解的个数
public void HowMany() {
System.out.println(n+"皇后问题共有解"+r+"组。");
}
//主方法main()
public static void main(String []args) {
//定义一个8皇后问题(有92组解)
cQueen Q1=new cQueen(8); //大于10,你的微机可能要死机!
//第一个皇后可以在任意一行布放
Q1.resolve(0); //参数在0到n-1之间任选
Q1.HowMany();
}
} //类Queen定义结束
关于看代码的人人都知道的小技巧,最小试探法来输出结果进行比较和分析
package com.newflypig.eightqueen;
import java.util.Date;
/**
* 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,
* 即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
* 下面使用递归方法解决
* @author newflydd@189.cn
*
*/
public class EightQueen {
private static final short N=15; //使用常量来定义,方便之后解N皇后问题
private static int count=0; //结果计数器
private static int K=0;
public static void main(String[] args) {
for(K=9;K=N;K++){
count=0;
Date begin =new Date();
//初始化棋盘,全部置0
short chess[][]=new short[K][K];
for(int i=0;iK;i++){
for(int j=0;jK;j++){
chess[i][j]=0;
}
}
putQueenAtRow(chess,0);
Date end =new Date();
System.out.println("解决 " +K+ " 皇后问题,用时:" +String.valueOf(end.getTime()-begin.getTime())+ "毫秒,计算结果:"+count);
}
}
private static void putQueenAtRow(short[][] chess, int row) {
/**
* 递归终止判断:如果row==N,则说明已经成功摆放了8个皇后
* 输出结果,终止递归
*/
if(row==K){
count++;
// System.out.println("第 "+ count +" 种解:");
// for(int i=0;iN;i++){
// for(int j=0;jN;j++){
// System.out.print(chess[i][j]+" ");
// }
// System.out.println();
// }
return;
}
short[][] chessTemp=chess.clone();
/**
* 向这一行的每一个位置尝试排放皇后
* 然后检测状态,如果安全则继续执行递归函数摆放下一行皇后
*/
for(int i=0;iK;i++){
//摆放这一行的皇后,之前要清掉所有这一行摆放的记录,防止污染棋盘
for(int j=0;jK;j++)
chessTemp[row][j]=0;
chessTemp[row][i]=1;
if( isSafety( chessTemp,row,i ) ){
putQueenAtRow(chessTemp,row+1);
}
}
}
private static boolean isSafety(short[][] chess,int row,int col) {
//判断中上、左上、右上是否安全
int step=1;
while(row-step=0){
if(chess[row-step][col]==1) //中上
return false;
if(col-step=0 chess[row-step][col-step]==1) //左上
return false;
if(col+stepK chess[row-step][col+step]==1) //右上
return false;
step++;
}
return true;
}
}