(note: late publish)
Tes Algorithm
contoh (ini agak lupa) hehe
input:
2 -->ket: jumlah pengetesan = 2
4 -->ket: ukuran matriks 4x4
0 0 0 0 -->ket: matriks 4x4
0 1 1 0
0 1 1 0 -->ket: perhatikan bahwa posisi air memiliki kedalaman yang sama yaitu 1, jadi total adalah 4x1=4
0 0 0 0
7 -->ket: ukuran matriks 7x7
0 0 0 0 0 0 0 -->ket: matriks 7x7
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 1 1 1 1 1 0 -->ket: perhatikan bahwa air memiliki 8 posisi dengan kedalaman 1 dan 1 posisi dengan kedalaman 3
0 0 0 1 0 0 0 sehingga total adalah (8x1) + (1x3) = 11
0 0 0 1 0 0 0
0 0 0 0 0 0 0
output:
#1 4 -->ket: hasil pengukuran matriks pertama
#2 11 -->ket: hasil pengukuran matriks kedua
#include <iostream>
using namespace std;
int matriks[100][100];
int T, N, volumeN, kedalaman_pertitik;
int fungsi_min(int a, int b, int c, int d);
int fungsi_cek(int j, int k);
int main()
{
cin >> T; //jumlah pengetesan matriks
for(int i=0; i<T; i++){
cin >> N; //ukuran matriks
for(int j=0; j<N; j++){
for (int k=0; k<N; k++){
cin >> matriks[j][k];
}
}
volumeN=0;
for(int j=1; j<(N-1); j++){
for (int k=1; k<(N-1); k++){
if (matriks[j][k]==1){
kedalaman_pertitik=fungsi_cek(j,k);
volumeN=volumeN+kedalaman_pertitik;
}
}
}
cout << "#"<< i+1 << " "<< volumeN << endl;
}
return 0;
}
int fungsi_cek(int j, int k)
{
int kiri=1, kanan=1, atas=1, bawah=1;
int l,m;
//cek kiri
l=j;
m=k;
while(matriks[l-1][m]==1){
kiri++;
l--;
}
//cek kanan
l=j;
m=k;
while(matriks[l+1][m]==1){
kanan++;
l++;
}
//cek atas
l=j;
m=k;
while(matriks[l][m-1]==1){
atas++;
m--;
}
//cek bawah
l=j;
m=k;
while(matriks[l][m+1]==1){
bawah++;
m++;
}
return fungsi_min(kiri,kanan,atas,bawah);
}
int fungsi_min(int a, int b, int c, int d)
{
int nilai_min=a;
if(nilai_min>b) nilai_min=b;
if(nilai_min>c) nilai_min=c;
if(nilai_min>d) nilai_min=d;
return nilai_min;
}
Berikut adalah printscreen hasil runningnya
Tes Algorithm
Baik.
Waktu pengerjaan 3 jam. Kalo gak salah ingat, kira-kira begini soalnya
(kata-kata yang Saya gunakan tidak sama persis ya..):
Untuk
mengetahui volume dari suatu danau, suatu perusahaan menggunakan data
dari citra digital dua dimensi (2D). Dengan ukuran matriks (NxN).
Nilai
"0" merepresentasikan tanah (land) dan nilai "1" merepresentasikan air
(water). Volume (kedalaman) air pada suatu posisi tergantung posisi air
tersebut terhadap tanah yang terdekat. Semakin jauh posisi air tersebut
terhadap tanah berarti semakin dalam (volume semakin besar). Jika posisi
air tepat disebelah tanah maka volumenya adalah 1, jika posisi air
selisih satu piksel terhadap tanah maka volumenya 2, begitu seterusnya.
Perhatikan bahwa posisi air terhadap tanah ditinjau dari arah utara,
selatan, barat, timur (pada pembahasan ini Saya andaikan atas, bawah,
kiri, kanan ---> dari representasi matriks 2D). Dan ingat dari ke
empat arah tersebut kedalaman air ditentukan dari jarak yang "paling
pendek" terhadap tanah.
oiya,, data digital (matriks 2D) dapat berisi lebih dari 1 danau, dan tepi-tepi dari matriks tersebut adalah tanah (0).
Input program:
-jumlah pengetesan matriks
-ukuran matriks N (ingat matriks berukuran NxN)
-nilai matriks
output program:
-"#[pengukuran ke] [volume]
contoh (ini agak lupa) hehe
input:
2 -->ket: jumlah pengetesan = 2
4 -->ket: ukuran matriks 4x4
0 0 0 0 -->ket: matriks 4x4
0 1 1 0
0 1 1 0 -->ket: perhatikan bahwa posisi air memiliki kedalaman yang sama yaitu 1, jadi total adalah 4x1=4
0 0 0 0
7 -->ket: ukuran matriks 7x7
0 0 0 0 0 0 0 -->ket: matriks 7x7
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 1 1 1 1 1 0 -->ket: perhatikan bahwa air memiliki 8 posisi dengan kedalaman 1 dan 1 posisi dengan kedalaman 3
0 0 0 1 0 0 0 sehingga total adalah (8x1) + (1x3) = 11
0 0 0 1 0 0 0
0 0 0 0 0 0 0
output:
#1 4 -->ket: hasil pengukuran matriks pertama
#2 11 -->ket: hasil pengukuran matriks kedua
Naaaahhh,
ini adalah jawaban setelah Saya kerjakan dikosan hehe. Tes udah lewat
eh kok malah dapat jawabannya. Alhamdulillah mudah-mudahan benar (paling
tidak dari beberapa pengujian yang Saya coba hasilnya sesuai :p )...
mungkin efek sudah kenyang hahaha.. halah ngelesss hahaha
Sebenernya
alur codingnya sih hampir sama dengan saat Saya ngerjakan tadi saat
tes. Bedanya disini sudah Saya bikin function terpisah dengan kode utama
sehingga mudah untuk penelusuran kesalahan. Dan bedanya lagi di sini
Saya ada menggunakan sintax "while" karena Saya lupa sintax caranya exit
dari for.hahaha --> inilah yang membuat tadi pas tess bingung...
huuuuuufttt.. Mudah mudahan tulisan ini bisa terupload kalo sdh larut
malam.
#include <iostream>
using namespace std;
int matriks[100][100];
int T, N, volumeN, kedalaman_pertitik;
int fungsi_min(int a, int b, int c, int d);
int fungsi_cek(int j, int k);
int main()
{
cin >> T; //jumlah pengetesan matriks
for(int i=0; i<T; i++){
cin >> N; //ukuran matriks
for(int j=0; j<N; j++){
for (int k=0; k<N; k++){
cin >> matriks[j][k];
}
}
volumeN=0;
for(int j=1; j<(N-1); j++){
for (int k=1; k<(N-1); k++){
if (matriks[j][k]==1){
kedalaman_pertitik=fungsi_cek(j,k);
volumeN=volumeN+kedalaman_pertitik;
}
}
}
cout << "#"<< i+1 << " "<< volumeN << endl;
}
return 0;
}
int fungsi_cek(int j, int k)
{
int kiri=1, kanan=1, atas=1, bawah=1;
int l,m;
//cek kiri
l=j;
m=k;
while(matriks[l-1][m]==1){
kiri++;
l--;
}
//cek kanan
l=j;
m=k;
while(matriks[l+1][m]==1){
kanan++;
l++;
}
//cek atas
l=j;
m=k;
while(matriks[l][m-1]==1){
atas++;
m--;
}
//cek bawah
l=j;
m=k;
while(matriks[l][m+1]==1){
bawah++;
m++;
}
return fungsi_min(kiri,kanan,atas,bawah);
}
int fungsi_min(int a, int b, int c, int d)
{
int nilai_min=a;
if(nilai_min>b) nilai_min=b;
if(nilai_min>c) nilai_min=c;
if(nilai_min>d) nilai_min=d;
return nilai_min;
}
Berikut adalah printscreen hasil runningnya
Attention: Code ini menggunakan compiler cpp (code::blocks under Ubuntu Linux 14.04)
##Code diatas belum tentu yang paling efisien, maklum hanya menuangkan isi kepala
Terimakasih. Semoga bermanfaat.
Salam berbagi..
Tidak ada komentar:
Posting Komentar
Selamat berinovasi :D Salam berbagi..