2020年09月 HNUCM-OJ演算法分析與設計作業8
技術標籤:演算法分析與設計
@ZHANGQIANYI2020
HNUCM-OJ 習題6-6 楊輝三角,小白鼠,放蘋果,數字交換,棋盤覆蓋問題,整數劃分問題之備忘錄法
問題 A: 習題6-6 楊輝三角
(時間限制: 1 Sec 記憶體限制: 12 MB)
題目描述:
按要求輸出如下格式的楊輝三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多輸出10層。
輸入:
輸入只包含一個正整數n,表示將要輸出的楊輝三角的層數。
輸出:
對應於該輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開。
樣例輸入:
5
樣例輸出:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
參考答案:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt();
int a[][]=new int[n+1][n+1];
for(int i=1;i<=n;i++) {
for(int j=1;j<=i;j++) {
if(i==j) {
a[i][j]=1;
}
else if(i==1||j==1) {
a[i][j]=1;
}else {
a[i][j]=a[i-1][j-1]+a[i-1][j];
}
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=i;j++) {
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
}
}
問題 B: 小白鼠
(時間限制: 1 Sec 記憶體限制: 128 MB)
題目描述:
N只小白鼠(1 <= N <= 100),每隻鼠頭上戴著一頂有顏色的帽子。
現在稱出每隻白鼠的重量,要求按照白鼠重量從大到小的順序輸出它們頭上帽子的顏色。
帽子的顏色用“red”,“blue”等字串來表示。
不同的小白鼠可以戴相同顏色的帽子。白鼠的重量用整數表示。
輸入:
多案例輸入,每個案例的輸入第一行為一個整數N,表示小白鼠的數目。
下面有N行,每行是一隻白鼠的資訊。第一個為不大於100的正整數,表示白鼠的重量;
第二個為字串,表示白鼠的帽子顏色,字串長度不超過10個字元。
注意:白鼠的重量各不相同。
輸出:
每個案例按照白鼠的重量從大到小的順序輸出白鼠的帽子顏色。
樣例輸入:
3
30 red
50 blue
40 green
樣例輸出:
blue
green
red
參考答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt();
int a[]=new int[n];
String b[]=new String[n];
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
b[i]=sc.next();
}
for(int i=0;i<n;i++) {
for(int j=i+1;j<n;j++) {
if(a[i]<a[j]) {
int s=a[i];
a[i]=a[j];
a[j]=s;
String color=b[i];
b[i]=b[j];
b[j]=color;
}
}
}
for(int i=0;i<n;i++) {
System.out.println(b[i]);
}
}
}
}
問題 C: 放蘋果
(時間限制: 1 Sec 記憶體限制: 128 MB)
題目描述:
把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?
(用K表示)5,1,1和1,5,1 是同一種分法。
輸入:
每行均包含二個整數M和N,以空格分開。1<=M,N<=10。
輸出:
對輸入的每組資料M和N,用一行輸出相應的K。
樣例輸入:
7 3
樣例輸出:
8
參考答案:
import java.util.Scanner;
public class Main{
public static int fangpingguo(int m,int n){
if(m==0||n==1){
return 1;
}
if(n>m){
return fangpingguo(m,m);
}
return fangpingguo(m,n-1)+fangpingguo(m-n,n);
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
int s=0;
s=fangpingguo(m,n);
System.out.println(s);
}
}
}
問題 D: 數字交換
(時間限制: 1 Sec 記憶體限制: 128MB)
題目描述:
輸入一個數n,然後輸入n個數值各不相同,調換陣列中最大和最小的兩個數,然後輸出。
輸入:
測試資料有多組,輸入n(1<=n<=20),接著輸入n個數。
輸出:
對於每組輸入,輸出交換後的結果。
樣例輸入:
2
1 3
樣例輸出:
3 1
參考答案:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
int n=sc.nextInt();
int M=0,N=0;
int a[]=new int[n];
int Min=0,Max=0,MinIndex=0,MaxIndex=0;
int temp;
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
for(int i=0;i<n;i++) {
if(i==0){
Min=a[i];
Max=a[i];
MinIndex=i;
MaxIndex=i;
}
if(Max<a[i]){
Max=a[i];
MaxIndex=i;
}
if(Min>a[i]){
Min=a[i];
MinIndex=i;
}
}
temp=a[MinIndex];
a[MinIndex]=a[MaxIndex];
a[MaxIndex]=temp;
for(int i=0;i<n;i++){
System.out.print(a[i]);
if(i !=n-1){
System.out.print(" ");
}
}
System.out.println();
}
}
}
問題 E: 棋盤覆蓋問題
(時間限制: 1 Sec 記憶體限制: 256MB)
題目描述:
在一個n×n (n = 2k)個方格組成的棋盤中,恰有一個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。
在棋盤覆蓋問題中,要用圖示的4種不同形態的L型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個L型骨牌不得重疊覆蓋。
輸入:
多組測試用例,每組測試用例包括兩部分,
第一部分為方格的寬度n,
第二部分則為方格,特殊方格為-1,其他方格為0。
輸出:
輸出覆蓋後的方案
樣例輸入:
4
-1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
樣例輸出:
-1 2 4 4
2 2 1 4
3 1 1 5
3 3 5 5
參考答案:
import java.util.Scanner;
public class Main {
static int title=1;
public static void qipanfugai(int a[][],int tr,int tc,int dr,int dc,int size){
if(size==1)return;
int t=title++;
int s=size/2;
if(dr<tr+s&&dc<tc+s){
qipanfugai(a,tr,tc,dr,dc,s);
}else{
a[tr+s-1][tc+s-1]=t;
qipanfugai(a,tr,tc,tr+s-1,tc+s-1,s);
}
if(dr>=tr+s&&dc<tc+s){
qipanfugai(a,tr+s,tc,dr,dc,s);
}else{
a[tr+s][tc+s-1]=t;
qipanfugai(a,tr+s,tc,tr+s,tc+s-1,s);
}
if(dr<tr+s&&dc>=tc+s){
qipanfugai(a,tr,tc+s,dr,dc,s);
}else{
a[tr+s-1][tc+s]=t;
qipanfugai(a,tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s&&dc>=tc+s){
qipanfugai(a,tr+s,tc+s,dr,dc,s);
}else{
a[tr+s][tc+s]=t;
qipanfugai(a,tr+s,tc+s,tr+s,tc+s,s);
}
}
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int x = 0,y = 0;
int n=sc.nextInt();
int a[][]=new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
a[i][j]=sc.nextInt();
if(a[i][j]==-1){
x=i;
y=j;
}
}
qipanfugai(a,0,0,x,y,n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
title=1;
}
}
}
問題 F: 整數劃分問題之備忘錄法
(時間限制: 1 Sec 記憶體限制: 128MB)
題目描述:
使用備忘錄法編寫一個程式,求一個正整數n的所有劃分個數。
例如,輸入3,輸出3;輸入4,輸出5。
輸入:
多組輸入,每一組是一個正整數n。
輸出:
輸出劃分數。
樣例輸入:
3
4
樣例輸出:
3
5
參考答案:
import java.util.Scanner;
public class Main {
static int a[][]=new int[100][100];
static int n;
public static int beiwanglu(int n,int m) {
if((n<1)||(m<1))
return 0;
if((n==1)||(m==1))
return 1;
if(n<m)
return beiwanglu(n,n);
if(n==m){
if (a[n-1][n-2]==0) {
a[n-1][n-2] = beiwanglu(n,n-1);
}
return 1 + a[n-1][n-2];
}
if (n>m) {
if (a[n-m-1][m-1]==0) {
a[n-m-1][m-1]=beiwanglu(n-m,m);
}
if (a[n-1][m-2]==0) {
a[n-1][m-2] = beiwanglu(n,m-1);
}
return a[n-1][m-2] + a[n-m-1][m-1];
}else{
return 0;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
n=sc.nextInt();
System.out.println(beiwanglu(n,n));
}
}
}