Ciao a tutti, per venerdi devo fare un programma per scuola.
il programma è chiamato WATERMAP, infatti questo simula, dato un territorio(matrice) ed una sorgente d'acqua(casella data dall'utente matrice) il percorso che compie l'acqua su questo territorio. l'acqua quindi scorrerà sulle celle che avranno un'altezza più bassa della sorgente d'acqua e le caselle più "basse" a sua volta, se hanno intorno celle più "basse" di queste, faranno scorrere l'acqua su quest'ultime e così via.
l'algoritmo che avevo pensato io si basa su questo procedimento:
1)viene fornita dall'utente la matrice di struct, la quale al suo interno contiene:altezza,minore e controllato.
2)viene data la sorgente e si inizia a controllare le 8 caselle che ha intorno.se la casella controllata è minore della sorgente, minore=1 e controllato=1, altrimenti minore=0 e controllato=0.
3)a fine del controllo andiamo a ricercare una casella che ha minore=1 ed appena trovata si ripete il controllo intorno ad essa, e due variabili che tengono il "segno" di dove si trovava la casella prendono le sue coordinate.
4)il ciclo finisce quando tutte le caselle sono state controllate.
(il programma fa tutto,ma printa in modo sbagliato il percorso dell'acqua.)
#include <iostream>
using namespace std;
#define MAX 100
struct casella{
int altezza;
int controllato;
int minore;
};
void acquisisciterritorio(struct casella territorio[MAX][MAX],int righe,int colonne){
int i,j;
for(i=0; i<righe; i++)
for(j=0; j<colonne; j++)
{
cout<<"dammi l'altezza";
cin>>territorio[i][j].altezza;
territorio[i][j].controllato=0;
territorio[i][j].minore=0;
}
}
void controllocircostante(casella territorio[][MAX],int righe,int colonne,int rsorg,int csorg){
//CONTROLLO INTORNO ALLA SORGENTE
if(territorio[rsorg][csorg].altezza >= territorio[rsorg-1][csorg-1].altezza)
{
territorio[rsorg-1][csorg-1].minore=1;
territorio[rsorg-1][csorg-1].controllato=1;
}
else
{
territorio[rsorg-1][csorg-1].controllato=1;
territorio[rsorg-1][csorg-1].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg-1][csorg].altezza)
{
territorio[rsorg-1][csorg].minore=1;
territorio[rsorg-1][csorg].controllato=1;
}
else
{
territorio[rsorg-1][csorg].controllato=1;
territorio[rsorg-1][csorg].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg-1][csorg+1].altezza)
{
territorio[rsorg-1][csorg+1].minore=1;
territorio[rsorg-1][csorg+1].controllato=1;
}
else
{
territorio[rsorg-1][csorg+1].controllato=1;
territorio[rsorg-1][csorg+1].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg][csorg-1].altezza)
{
territorio[rsorg][csorg-1].minore=1;
territorio[rsorg][csorg-1].controllato=1;
}
else
{
territorio[rsorg][csorg-1].controllato=1;
territorio[rsorg][csorg-1].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg][csorg+1].altezza)
{
territorio[rsorg][csorg+1].minore=1;
territorio[rsorg][csorg+1].controllato=1;
}
else
{
territorio[rsorg][csorg+1].controllato=1;
territorio[rsorg][csorg+1].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg+1][csorg-1].altezza)
{
territorio[rsorg+1][csorg-1].minore=1;
territorio[rsorg+1][csorg-1].controllato=1;
}
else
{
territorio[rsorg+1][csorg-1].controllato=1;
territorio[rsorg+1][csorg-1].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg+1][csorg].altezza)
{
territorio[rsorg+1][csorg].minore=1;
territorio[rsorg+1][csorg].controllato=1;
}
else
{
territorio[rsorg+1][csorg].controllato=1;
territorio[rsorg+1][csorg].minore=0;
}
if(territorio[rsorg][csorg].altezza >= territorio[rsorg+1][csorg+1].altezza)
{
territorio[rsorg+1][csorg+1].minore=1;
territorio[rsorg+1][csorg+1].controllato=1;
}
else
{
territorio[rsorg+1][csorg+1].controllato=1;
territorio[rsorg+1][csorg+1].minore=0;
}
//FINE CONTROLLO INTORNO ALLA SORGENTE
}
void allagamento(casella territorio[MAX][MAX],int righe,int colonne){
int i,j,a,b,casellaminore=0,casellaminore2=0,rsorg,cso rg,noncontrollato;
cout<<"dammi i metri di lunghezza dai quali parte la sorgente";
cin>>rsorg;
cout<<"dammi i metri di larghezza dai quali parte la sorgente";
cin>>csorg;
do{
noncontrollato=0;
controllocircostante(territorio,righe,colonne,rsor g,csorg);
//CONTROLLO RICERCA MINORE
for(i=casellaminore;i<righe;i++){
for(j=casellaminore2;j<colonne;j++){
if(territorio[i][j].minore){
rsorg=i;
csorg=j;
casellaminore=i;
casellaminore2=j;
controllocircostante(territorio,righe,colonne,rsor g,csorg);
}
}
}
//CONTROLLO RICERCA CONTROLLATO
for(a=0;a<righe;a++){
for(b=0;b<colonne;b++){
if(territorio[a][b].controllato=0)
noncontrollato=1;
}
}
}while(noncontrollato);
}
void visualizza(casella territorio[][MAX],int righe,int colonne){
int i,j;
for(i=0;i<righe;i++){
cout<<"\n";
for(j=0;j<colonne;j++){
if(territorio[i][j].minore){
cout<<"#"<<territorio[i][j].altezza;
}else{
cout<<"*"<<territorio[i][j].altezza;
}
}
}
}
int main(){
int righe,colonne;
struct casella territorio[MAX][MAX];
//ACQUISIZIONE PERIMETRO
do
{
cout<<"dammi il numero di metri di lunghezza di territorio che vuoi analizzare";
cin>>righe;
}
while(righe<0);
do
{
cout<<"dammi il numero di metri di larghezza di territorio che vuoi analizzare";
cin>>colonne;
}
while(colonne<0);
//ACQUISIZIONE MATRICE E CONTROLLI
acquisisciterritorio(territorio,righe,colonne);
//ALGORITMO
allagamento(territorio,righe,colonne);
//VISUALIZZA
visualizza(territorio,righe,colonne);
}