Cod sursa(job #1861594)

Utilizator geek_geekGeek Geek geek_geek Data 29 ianuarie 2017 03:15:40
Problema Kdrum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <fstream>
#include <queue>
#include <iostream>
using namespace std;

struct queue_elem {
	int posX;
	int posY;
};

int cmmdc(int a, int b) {
	int rest;
	while(b != 0) {
		rest = b;
		b = a % b;
		a = rest;
	}
	return a;
}

int look_for_neighbors(int grid[50][50], int lee[50][50], int n, int m, queue<queue_elem> vecini, int stop_x, int stop_y, int k) {
	while(!vecini.empty()) {
		queue_elem to_be_processed = vecini.front();
		vecini.pop();

		int i = to_be_processed.posX;
		int j = to_be_processed.posY;

		if(i == stop_x && j == stop_y && cmmdc(lee[i][j], k) == k)
			return grid[i][j];
		
		if(i <= n - 1 && lee[i + 1][j] != 0) {
			lee[i + 1][j] = lee[i][j] * cmmdc(lee[i + 1][j], k);
			grid[i + 1][j] = grid[i][j] + 1;
			queue_elem new_elem;
			new_elem.posX = i + 1;
			new_elem.posY = j;
			vecini.push(new_elem);
		}

		if(j <= m - 1 && lee[i][j + 1] != 0) {
			lee[i][j + 1] = lee[i][j] * cmmdc(lee[i][j + 1], k);
			grid[i][j + 1] = grid[i][j] + 1;
			queue_elem new_elem;
			new_elem.posX = i;
			new_elem.posY = j + 1;
			vecini.push(new_elem);
		}

		if(i - 1 >= 1 && lee[i - 1][j] != 0) {
			lee[i - 1][j] = lee[i][j] * cmmdc(lee[i - 1][j], k);;
			grid[i - 1][j] = grid[i][j] + 1;
			queue_elem new_elem;
			new_elem.posX = i - 1;
			new_elem.posY = j;
			vecini.push(new_elem);
		}

		if(j - 1 >= 1 && lee[i][j - 1] != 0) {
			lee[i][j - 1] = lee[i][j] * cmmdc(lee[i][j - 1], k);
			grid[i][j - 1] = grid[i][j] + 1;
			queue_elem new_elem;
			new_elem.posX = i;
			new_elem.posY = j - 1;
			vecini.push(new_elem);
		}
	}
	return -1;
}

int main() {
	ifstream fin("kdrum.in", fstream::in);
	ofstream fout("kdrum.out", fstream::out);
	int n;
	int lee[50][50], grid[50][50];
	int m;
	int k;
	int i;
	int j;
	int start_x, start_y, stop_y, stop_x;
	queue<queue_elem> vecini;
	fin >> n >> m >> k;
	fin >> start_x >> start_y >> stop_x >> stop_y;
	for(i = 1; i <= n; i++) {
		for(j = 1; j <= m; j++) {
			fin >> lee[i][j];
			grid[i][j] = 0;
		}
	}


	
	queue_elem new_elem;
	new_elem.posX = start_x;
	new_elem.posY = start_y;
	grid[start_x][start_y] = 1;
	vecini.push(new_elem);

	fout << look_for_neighbors(grid, lee, n, m, vecini, stop_x, stop_y, k) << endl;
	

	for(i = 1; i <= n; i++) {
		for(j = 1; j <= m; j++) {
			cout << grid[i][j] << ' ';
		}
		cout << endl;
	}
	cout << endl;

	for(i = 1; i <= n; i++) {
		for(j = 1; j <= m; j++) {
			cout << lee[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
}