Exercitiu c++

Discutii despre tot ce nu se incadreaza in celelalte categorii.

Moderators: Moderatori ajutatori, Moderatori

Post Reply
User avatar
bogdhy
Membru, skill +1
Membru, skill +1
Posts: 361
Joined: 29 Dec 2010, 16:50
Detinator Steam: Da
Has thanked: 27 times
Been thanked: 19 times

27 Feb 2013, 23:34

Enunt | Afiseaza codul
Jocul nostru presupune parcurgerea unui tablou bidimensional cu două linii şi n coloane, format din 2 x n celule pătratice. Fiecare celulă are asociată câte o valoare întreagă v care nu se modifică pe durata desfăşurării jocului. Jucătorii trebuie să găsească un drum de la celula de plecare la celula de sosire care respectă următoarele condiţii:

    celula de plecare este cea din linia 1 şi coloana 1, iar celula de sosire este cea din linia 2 şi coloana n.

    nu trece decât cel mult odată prin oricare celulă.

    deplasarea se poate face din celula curentă spre oricare altă celulă învecinată cu ea pe orizontală sau verticală.

    conţine cel mult k celule consecutive aflate pe aceeaşi linie.

Pentru un astfel de drum se calculează punctajul acestuia ca fiind egal cu suma valorilor asociate celulelor prin care trece drumul.

Cerinţă

Cunoscând valorile asociate celulelor tabloului, scrieţi un program care determină punctajul maxim care poate fi obţinut în acest joc.

Date de intrare

Fişierul de intrare joc.in va conţine pe prima linie două numere naturale n şi k separate printr-un spaţiu cu semnificaţiile din enunţ. Pe fiecare dintre următoarele două linii se găsesc câte n numere întregi, reprezentând valorile asociate celor 2 x n celule ale tabloului.

Date de ieşire

Fişierul de ieşire joc.out va conţine pe prima linie numărul întreg p, reprezentând punctajul maxim care se poate obţine.

Restricţii şi precizări

    2 ≤ n ≤ 5000

    2 ≤ k ≤ 10, k ≤ n

    -1000 ≤ v ≤ 1000

    Pentru 40% dintre cazurile de test n ≤ 40
main.cpp | Afiseaza codul
[code]#include <iostream>
#include <fstream>
using namespace std;

ifstream f("joc.in");
ofstream g("joc.out");

int a[2][20],v[20],n,k,z,x=1,y=1,ok=1,m;

void construire()
{
	f>>n>>k;

	for(int i=1;i<=2;i++)
		for(int j=1;j<=n;j++)
			f>>a[j];
}

void afisare()
{
	for(int i=1;i<=2;i++)
	{	for(int j=1;j<=n;j++)
			cout<<a[j]<<" ";
		cout<<endl;
	}
}

void parcurgere()
{
	v[m]=a[x][y];
	m++;
	z++;
	while(ok)
	{

		if(z==k-1)
		{
			if(x==1)
			{
				x++;
				v[m]=a[x][y];
				m++;
				z=0;
			}
			else if(x==2)
			{
				x--;
				v[m]=a[x][y];
				m++;
				z=0;
			}

		}

		if(x==1)
		{
			if(a[x+1][y]>a[x][y+1])
			{
				x++;
				v[m]=a[x][y];
				m++;
				z=0;
			}
			else
			{
				y++;
				v[m]=a[x][y];
				m++;
				z++;
			}
		}
		if(x==2)
		{
			if(a[x-1][y]>a[x][y+1])
			{
				x--;
				v[m]=a[x][y];
				m++;
				z=0;
			}
			else
			{
				y++;
				v[m]=a[x][y];
				m++;
				z++;
			}
		}
		if(x==2 && y==n)
			ok=0;
	}
}

int main()
{
    int S=0;
	construire();
	afisare();
	parcurgere();
	cout<<" ---------------- "<<endl;
	for(int i=0;i<m;i++)
	{
	    cout<<v<<" ";
	    S+=v;

	}
	g<<S;

}
[/code]
joc.in | Afiseaza codul
[code]6 3
0 -2 5 4 -9 -1
-1 3 2 7 0 1
[/code]
As vrea sa stiu si eu care este greseala de ce imi afiseaza aiurea .

In loc de

Code: Select all

0 -1 3 2 5 4 7 0 1
afiseaza

Code: Select all

0 -1 3 2 5 4 5 4 5
Image
RoyalServer 2
User avatar
aNNakin
Fost administrator
Fost administrator
Posts: 10464
Joined: 17 Dec 2007, 21:42
Detinator Steam: Da
CS Status: a iubi - necesar si suficient
Detinator server CS: romania.cs16.ro
SteamID: anakin_cstrike16
Reputatie: Membru Club eXtreamCS
Fost Contribuitor
Fost Scripter eXtreamCS
Fost Lider Echipa eXtreamCS
Fost Administrator
Location: di.fm
Has thanked: 230 times
Been thanked: 787 times
Contact:

28 Feb 2013, 00:28

Cred ca trebuie facuta prin backtracking in primul rand
Post Reply

Return to “Discutii generale”

  • Information