Untitled

 avatar
unknown
plain_text
4 years ago
9.0 kB
4
Indexable
/* TP, 2018/2019, Zadaća 1, Zadatak 2

	NAPOMENA: ulaz/izlaz za zadatke je specificiran
	javnim autotestovima. Zalbe za ne analiziranje testova
	se ne uvazavaju!

	NAPOMENA: nece svi (javni) testovi sa zamgera biti
	dostupni na c9.
*/
#include <iostream>
#include <complex>
#include <vector>
#include <stdexcept>
typedef std::vector<std::vector<int>> Matrica;


std::complex<int> MaxElement(Matrica m, int i, int j)
{
	int max_i = i;
	int max_j = j;
	
	if(m.at(0).size()==1){
		if(i==0){
			if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) return std::complex<int>(i+1,j);
		}
		if(i==m.size()-1){
			if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) return std::complex<int>(i-1,j);
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) max_i=i+1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		return std::complex<int>(max_i,max_j);
	}
	else if(m.size()==1){
		if(j==0){
			if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) return std::complex<int>(i,j+1);
		}
		if(j==m.at(0).size()-1){
			if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) return std::complex<int>(i,j-1);
		}
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
		return std::complex<int>(max_i,max_j);
	}
	else if(i==0 && j==0) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) {
			max_j = j+1;
		}

		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) {
			max_i = i+1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j+1)) {
			max_i = i+1;
			max_j = j+1;
		}
		return std::complex<int>(max_i,max_j);

	} else if(i==0 && j==m.at(0).size()-1) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) {
			max_j=j-1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) {
			max_i=i+1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j-1)) {
			max_i=i+1;
			max_j=j-1;
		}
		return std::complex<int>(max_i,max_j);
	} else if(i==m.size()-1 && j==0) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j+1)) {
			max_i=i-1;
			max_j=j+1;
		}
		return std::complex<int>(max_i,max_j);
	} else if(i==m.size()-1 && j==m.at(0).size()-1) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j-1)) {
			max_i=i-1;
			max_j=j-1;
		}
		return std::complex<int>(max_i,max_j);

	} else if(i==0) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j+1)) {
			max_i=i+1;
			max_j=j+1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) max_i=i+1;
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j-1)) {
			max_i=i+1;
			max_j=j-1;
		}
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
		return std::complex<int>(max_i,max_j);
	} else if(i==m.size()-1) {
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j+1)) {
			max_i=i-1;
			max_j=j+1;
		}
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j-1)) {
			max_i=i-1;
			max_j=j-1;
		}

	} else if(j==0) {
		if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) max_i=i+1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j+1)) {
			max_i=i-1;
			max_j=j+1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j+1)) {
			max_i=i+1;
			max_j=j+1;
		}
		return std::complex<int>(max_i,max_j);
	}
	else if(j==m.at(0).size()-1){
		if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) max_i=i+1;
		if(m.at(max_i).at(max_j)<m.at(i-1).at(j-1)){
			max_i=i-1;
			max_j=j-1;
		}
		if(m.at(max_i).at(max_j)<m.at(i+1).at(j-1)){
			max_i=i+1;
			max_j=j-1;
		}
		return std::complex<int>(max_i,max_j);
	}
		else{
			if(m.at(max_i).at(max_j)<m.at(i-1).at(j)) max_i=i-1;
			if(m.at(max_i).at(max_j)<m.at(i-1).at(j+1)){
				max_i=i-1;
				max_j=j+1;
			}
			if(m.at(max_i).at(max_j)<m.at(i).at(j+1)) max_j=j+1;
			if(m.at(max_i).at(max_j)<m.at(i+1).at(j+1)){
				max_i=i+1;
				max_j=j+1;
			}
			if(m.at(max_i).at(max_j)<m.at(i+1).at(j)) max_i=i+1;
			if(m.at(max_i).at(max_j)<m.at(i+1).at(j-1)){
				max_i=i+1;
				max_j=j-1;
			}
			if(m.at(max_i).at(max_j)<m.at(i).at(j-1)) max_j=j-1;
			if(m.at(max_i).at(max_j)<m.at(i-1).at(j-1)){
				max_i=i-1;
				max_j=j-1;
			}
			return std::complex<int>(max_i,max_j);
		}
	
	
	return std::complex<int>(max_i,max_j);
}


bool JeLiVrh(Matrica m, int i, int j)
{
	if(m.size()==1 && m.at(0).size()==1) return true;
	else if(m.at(0).size()==1){
		if(i==m.size()-1){
			if(m.at(i).at(j)>=m.at(i-1).at(j)) return true;
			else return false;
		}
		if(i==0){
			if(m.at(i).at(j)>=m.at(i+1).at(j)) return true;
			else return false;
		}
		if(m.at(i).at(j)>=m.at(i+1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j)) return true;
		else return false;
	}
	else if(m.size()==1){
		if(j==m.at(0).size()-1){
			if(m.at(i).at(j)>=m.at(i).at(j-1)) return true;
			else return false;
		}
		if(j==0){
			if(m.at(i).at(j)>=m.at(i).at(j+1)) return true;
			else return false;
		}
		if(m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j-1)) return true;
		else return false;
	}
	else if (i==0 && j==0) {
		if(m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i+1).at(j)&&m.at(i).at(j)>=m.at(i+1).at(j+1)) return true;
		else return false;
	} else if(i==0 && j==m.at(0).size()-1) {
		if(m.at(i).at(j)>=m.at(i).at(j-1)&& m.at(i).at(j)>=m.at(i+1).at(j) &&m.at(i).at(j)>=m.at(i+1).at(j-1)) return true;
		else return false;
	} else if(i==m.size()-1 && j==0) {
		if(m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j+1)) return true;
		else return false;
	} else if(i==m.size()-1 && j==m.at(0).size()-1) {
		if(m.at(i).at(j)>=m.at(i).at(j-1) && m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j-1)) return true;
		else return false;
	} else if(i==0) {
		if(m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i).at(j-1)&&m.at(i).at(j)>=m.at(i+1).at(j)&&m.at(i).at(j)>=m.at(i+1).at(j+1)&&m.at(i).at(j)>=m.at(i+1).at(j-1)) return true;
		else return false;
	} else if(i==m.size()-1) {
		if(m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i).at(j-1) && m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j-1) && m.at(i).at(j)>=m.at(i-1).at(j+1)) return true;
		else return false;
	} else if(j==0) {
		if(m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j+1) && m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i+1).at(j) && m.at(i).at(j)>=m.at(i+1).at(j+1)) return true;
			else return false;
			} else if(j==m.at(0).size()-1) {
		if(m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j-1) && m.at(i).at(j)>=m.at(i).at(j-1) && m.at(i).at(j)>=m.at(i+1).at(j-1) && m.at(i).at(j)>=m.at(i+1).at(j)) return true;
		else return false;
	} else {
		if(m.at(i).at(j)>=m.at(i-1).at(j) && m.at(i).at(j)>=m.at(i-1).at(j+1) && m.at(i).at(j)>=m.at(i).at(j+1) && m.at(i).at(j)>=m.at(i+1).at(j+1) && m.at(i).at(j)>=m.at(i+1).at(j)&&m.at(i).at(j)>=m.at(i+1).at(j-1)&&m.at(i).at(j)>=m.at(i).at(j-1)&&m.at(i).at(j)>=m.at(i-1).at(j-1)) return true;
		else return false;

	}
 return false;
}

std::complex<double> VrhMatrice(Matrica m, int red, int kolona)
{
	Matrica prazna;
	if(m==prazna) throw std::domain_error("Nekorektna matrica");
	if(m.at(0).size()==0 || m.size()==0) throw std::domain_error("Nekorektna matrica");
	if(red>m.size() || kolona>m.at(0).size() || red<0 || kolona<0) throw std::range_error("Nekorektna pocetna pozicija");
	for(int i = 0; i<m.size(); i++)
		if(m.at(i).size() != m.at(0).size()) throw std::domain_error("Nekorektna matrica");
	std::complex<double> z(red,kolona);
	while(1) {
		if(JeLiVrh(m,z.real(),z.imag())) {
			return z;
		} else {
			z=MaxElement(m,z.real(),z.imag());
		}
	}



}


int main ()
{
	int red, kolona;
	std::cout<<"Unesite broj redova i kolona matrice:"<<std::endl;
	std::cin>>red>>kolona;
	Matrica m(red,std::vector<int>(kolona));
	std::cout<<"Unesite elemente matrice:"<<std::endl;
	for(int i = 0; i<red; i++){
		for(int j = 0; j<kolona; j++){
			int x;
			std::cin>>x;
			m.at(i).at(j)=x;
		}
	}
	std::cout<<"Unesite poziciju odakle zapocinje pretraga:"<<std::endl;
	int x,y;
	std::cin>>x>>y;
	std::complex<double> rez;
	try{
	rez = VrhMatrice(m,x,y);
	}
	catch(std::range_error greska){
		std::cout<<"Greska: "<<greska.what();
		return 0;
	}
	catch(std::domain_error e){
		std::cout<<e.what();
	}
	std::cout<<"Nadjen je vrh matrice na poziciji "<<std::real(rez)<<" "<<std::imag(rez)<<std::endl;
	std::cout<<"Njegova vrijednost je "<<m.at(rez.real()).at(rez.imag());
	return 0;
}
Editor is loading...