Wali NZEC'iem jakiś pomysł?
Program w C#
EDIT:
jeszcze wpadł mi do głowy pomysł, że to przez tego stringa w tablicach ale zmieniłem na inty i dalej to samo
using System;
namespace 1042.Transponowaniemacierzy___TRN
{
class Program
{
static void Main(string[] args)
{
string line;
int columns=0, rows=0;line = Console.ReadLine(); string[] split = line.Split(' '); rows = Convert.ToInt32(split[0]); columns = Convert.ToInt32(split[1]); string[,] macierz = new string[rows, columns]; string[,] transponowana = new string[columns, rows]; for(int i =0; i < rows; i++) { line = Console.ReadLine(); string[] split1 = line.Split(' '); for(int j = 0; j < split1.Length; j++) { macierz[i, j] = split1[j]; } } for(int i =0; i < columns; i++) { for(int j =0; j < rows; j++) { transponowana[i, j] = macierz[j, i]; } } for(int i =0; i < columns; i++) { for(int j =0; j < rows; j++) { if (j != rows - 1) Console.Write(transponowana[i, j] + " "); else if (i == columns - 1) Console.Write(transponowana[i, j]); else Console.WriteLine(transponowana[i, j]); } } } }
}
Cześć nie mam pojęcia dlaczego kod nie przechodzi
u mnie działa poprawnie. Pisane w javie:
`import java.util.*;
import java.lang.*;
class Main
{
public static void main (String[] args) throws java.lang.Exception
{
int m,n;
Scanner scan= new Scanner(System.in);
m=scan.nextInt();
n=scan.nextInt();
int tab[][]=new int [m][n];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++){
tab[i][j]=scan.nextInt();
}
int tab2 [][]=new int [n][m];
for(int j=0; j<n; j++)
for(int i=0; i<m; i++){
tab2[j][i]=tab[i][j];
}
for(int j=0; j<n; j++){
for(int i=0; i<m; i++){
System.out.print(tab2[j][i]+ " ");
}
System.out.println();
}
}
}`
A może powinieneś napisać dokładniej czemu nie przechodzi?
Nie przechodzi z powodu przekroczenia limitu czasu.
http://213.192.104.217/phpBB3-spoj-pl-backup/viewtopic.php?f=10&t=1209&sid=75194fe608dc3d89b8d39e55a33165ab37
#include <iostream>
int n, m;
using namespace std;
int main()
{
cin >> m >> n;
int t[m][n];
for (int i=1;i<=m;i++)
{
for (int j=1;j<=n;j++)
{
cin >> t[i][j];
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<m;j++)
{
cout << t[j][i] << " ";
}
cout << t[m][i];
cout << endl;
}
return 0;
}
bardzo prosze o pomoc xd wyniki dzialaja, spacje sa opanowane ale cos nie smiga ...
Poniższy kod generuje werdykt przekroczony limit czasu. Czy można przyśpieszyć poniższy kod, czy konieczne będzie inne rozwiązanie?
`Scanner in = new Scanner(System.in);
int w = in.nextInt();
int k = in.nextInt();
int[] values = new int[w*k];
for(int i=0;i<w*k;i++){
values[i]=in.nextInt();
}
for(int i=0;i<k;i++){
for(int j=0;j<w;j++){
System.out.print(values[i+j*k] + " ");
}
System.out.println();
}`
Możesz spróbować wyprowadzić dane poprzez StringBuilder, ale podejrzewam, że sama zmiana wyjścia nie wystarczy. Na wejściu można spróbować wczytać wszystkie dane do stringa i samemu potem go pociąć.
Zdecydowanie łatwiej przejść na C/C++
Hej, nie mogę znaleźć błędu. SPOJ informuje mnie o (SIGABRT) ale nie wiem gdzie to mogę to poprawić.
KOD c++:
#include <iostream>
using namespace std;
int n, m, liczba;
int main()
{
cin >> m >> n;
int tab[m + 1][n+1];
for(int j=1; j<=m; j++)
{
for(int i=1; i<=n; i++)
{
cin>>liczba;
tab[i][j]=liczba;
}
}
for(int j=1; j<=n; j++)
{
for(int i=1; i<=m; i++)
{
if(i<m)
{
cout<<tab[j][i]<<" ";
}
else
{
cout<<tab[j][i];
}
}
if(j<n) cout<<endl;
}
for (int i = 0; i<m; i++)
{
delete[] tab[i];
}
delete[] tab;
return 0;
}
Cześć,
zawsze jak piszesz posta to możesz zaznaczyć kod i zobaczyć co robią te guziczki u góry, np </> sformatuje Ci kod.
To:
int tab[m + 1][n+1];
nie jest prawidłowa deklaracja tablicy o wielkości nie znanej podczas kompilacji. Powinieneś uzyć new[] lub vektora. Ale w gcc zazwyczaj działa mimo, że ta składnia nie jest częścią jezyka
Za to jak wykonasz delete na czymś czego nie tworzyłeś za pomocą słowa new to wtedy zazwyczaj dostaniesz bład i to właśnie prawdopodobnie SIGABRT.
A tak w ogóle to delete Ci się raczej na spoju nie przyda, ale w bardzo małym odsetku zadań. A niech sobie sędzia sam z pamięcią radzi
-
Czytamy komunikaty błędów i warningi. Drugie można zignorować (podobnie jak errory - w końcu jesteś wolnym człowiekiem i nie musisz ograniczać się do kompilujących, działających kodów
), ale na ogół sugerują jakiś błąd, który wyjdzie przy wykonywaniu kodu.
main.cpp: In function ‘int main()’:
main.cpp:37:23: warning: deleting array 'tab[i]'
delete[] tab[i];
^
main.cpp:39:14: warning: deleting array 'tab’
delete[] tab;
^ -
Co do:
Nie, nie powinieneś użyć vector - najpierw naucz się tablic a potem vector
-
Jak słusznie zauważył @j4rooo:
Skoro już wiesz, że gcc/g++ to jedno, a C/C++ to drugie, możesz się zastanawiać, jak to ze sobą połączyć
Użycie --pedantic od razu daje dodatkowe ostrzeżenia
main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
int tab[m + 1][n+1];
^
main.cpp:8:23: warning: ISO C++ forbids variable length array ‘tab’ [-Wvla]
main.cpp:37:23: warning: deleting array 'tab[i]'
delete[] tab[i];
^
main.cpp:39:14: warning: deleting array 'tab’
delete[] tab;
^Oczywiście w praktyce cwane sztuczki z użyciem komplikatorów życia mogą mieć uzasadnienie, natomiast na SPOJu radzę traktować kodzenie jak sztukę - pisać kody zgodne z powszechnie obowiązującymi standardami.
-
A na koniec:
Prawda, dotyczy to także destruktorów, natomiast na razie niech Ci się to przydaje - jak będziesz umiał tego użyć to potem świadomie, w pełni rozumiejąc konsekwencje swoich poczynań, możesz kombinować
Niby odpowiedzi wychodzą git, ale sędzia mówi, że naruszenie pamięci. Ktoś ma pomysł gdzie to może być?
#include <iostream>
#include <vector>
using namespace std;
void wpisz(vector<vector<int> > & tab)
{
for(int n=0 ; n<tab.size() ; n++)
{
for(int m=0 ; m<tab[n].size() ; m++)
{
int a;
cin>>a;
tab[m][n]=a;
}
;
}
}
void pokaz(vector<vector<int> >& tab)
{
for(int m=0 ; m<tab[m].size() ; m++)
{
for(int n=0 ; n<tab.size() ; n++)
{
cout<<tab[m][n];
}
cout<<endl;
}
}
int main()
{
int m,n;
cin>>m>>n;
vector<vector<int> >tab (n,vector<int>(m));
wpisz(tab);
pokaz(tab);
return 0;
}