Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σε όλο το forum,μόλις joinαρα και θα ήθελα αν είναι δυνατόν να με βοηθήσετε στο παρακάτω πρόβλημα.

Πρέπει να γράψω ένα πρόγραμμα Java το οποίο να λύνει το εξής πρόβλημα από την εποχή των ιπποτών. Μία ομάδα από ιππότες με ονόματα π.χ 1,2,3,…m, κάθονται γύρω από ένα στρογγυλό τραπέζι και πρέπει να αποφασίσουν ποιος (ένας μόνο) θα πάει στην επόμενη δύσκολη αποστολή. Επιλέγεται ένας αριθμός k και αρχίζουν να μετράνε από τον πρώτο ιππότη και κατά την φορά των δεικτών του ρολογιού μέχρι να μετρηθούν k ιππότες. Ο k-ος ιππότης βγαίνει έξω και το μέτρημα ξαναρχίζει με τον αμέσως επόμενο από τους εναπομείναντες ιππότες. Αυτό συνεχίζεται μέχρι να μείνει μόνο ένας ιππότης στο τραπέζι και αυτός αναλαμβάνει την επόμενη αποστολή. Π.χ για m=5 και k=2 αρχίζουμε το μέτρημα από τον 1 και θα είχαμε

1,2,3,4,5 φεύγει ο 2 -> 1,3,4,5 φεύγει ο 4 -> 1,3,5 φεύγει ο 1 -> 3,5 φεύγει ο 5 και μένει τελικά ο 3

Θέλουμε μία συνάρτηση S(m, k) η οποία να επιστρέφει τον εναπομένοντα ιππότη για οποιαδήποτε δεδομένα m και k. Θέλουμε να γράψουμε ένα πρόγραμμα java το οποίο να συμπληρώνει και να εκτυπώνει ένα δισδιάστατο πίνακα Α20x20 όπου A[m, k]=S(m,k) για m=1,2,3,…,20 και k=1,2,3,…,20. 

Γενικά τα προγράμματα μας πρέπει να ακολουθούν το παράδειγμα του αντικειμενοστραφούς δομημένου προγραμματισμού. Αυτό σημαίνει ότι πρέπει να χρησιμοποιούμε κλάσεις, μεθόδους και δομές ελέγχου ροής προγράμματος στις συναρτήσεις για επί μέρους υπολογισμούς και ενέργειες.
 

έχω φτιάξει αυτό εδώ μέχρι στιγμής :


import java.io.*;
import java.util.*; 


public class Ergasia
{
public static void main(String[] args) throws IOException { 


int rows, cols;
int[][] matrix;
Scanner input = new Scanner(System.in);
System.out.print("Poses Grammes: ");
rows = input.nextInt();
System.out.print("Poses Sthles: ");
cols = input.nextInt();
matrix = new int[rows][cols];
System.out.println("Dwse ta stoixeia tou pinaka (grammh pros grammh): ");
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
matrix[j] = input.nextInt();
}
}
System.out.println("Matrix is: ");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(matrix[j]+" ");
}
System.out.println();
}
}
}


Ευχαριστώ εκ των προτέρων

Υ.Γ. Είμαι Μαθηματικό γι'αυτό δεν έχω και μεγάλη ιδέα

Δημοσ.

Φτιαξε καπως ετσι

class CircularList
{
  List<int> list;
  int index = -1;		
  public CircularList(int m)
  {
   list = new List<int>();
   for(int i = 1; i <= m; i++)
    list.Add(i);
  }
  public void RemoveAfter(int k)
  {
    ...
  }
  public int Count()
  {
    return list.Count;
  }
  public int GetKnight()
  {
    return list[0];
  }
}

....
CircularList cl = new CircularList(5);
int k = 2;
while(cl.Count() > 1)
 cl.RemoveAfter(k);

A[5,2] = cl.GetKnight();

Γραψε των κωδικα για την RemoveAfter() και ειναι ετοιμο (ειναι C#)

Δημοσ.

ωραια, μιας και εισαι μαθηματικο, μηπως μπορεις να σκεφτεις μια formula που μπορει να υπολογιζει τον εναπομεινοντα κατευθειαν, χωρις δηλαδη να χρειαζεσαι βρογχους που θα τους αφαιρει εναν-εναν??

 

κατι δλδ της μορφης:

 

 

i = x - 2^n = x - 2^Floor[Log[2,x]]

2i + 1 = 2(x - 2^Floor[Log[2,x]]) + 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...