Cod sursa(job #389550)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 1 februarie 2010 20:38:51
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
using namespace std;

ifstream in("robot.in");
ofstream out("robot.out");

int m,n,x[32][32],len,i,num,j,sol;
unsigned long k,l;

int main()
{
	in>>m>>n;
	for(i=1; i<=m; i++)
	{
		in>>k;
		if(!k)
			continue;
		len = 0;
		l = 1;
		len=1;
		while((l<<1)<=k)
			{l<<=1;len++;}
		if(len>n)
			k>>=(len-n);
		for(j=n; j>=1; j--)
		{
			if(k%2)
				num++;
			x[i][j] = k%2;
			k/=2;
		}
	}
	out<<num<<'\n';
	
	// cazul 0 - fara schimbare de directie
	if(m==1 || n==1)
	{
		if(num==0)
			out<<0;
		else
			out<<-1;
		return 0;
	}
	
	// cazul 1 - directie dreapta-sus
	sol=1;
	for(i=1; i<=n&&sol; i++)
		if(x[1][i])
			sol=0;
	for(i=1; i<=m&&sol; i++)
		if(x[i][n])
			sol=0;
	if(sol)
		{out<<1<<' '<<n;return 0;}
	
	// cazul 2 - directia stanga-jos
	sol=1;
	for(i=1; i<=m; i++)
		if(x[i][1])
			sol=0;
	for(i=1; i<=n; i++)
		if(x[m][i])
			sol=0;
	if(sol)
		{out<<m<<' '<<1;return 0;}
	
	// cazul 3 - doua directii, prima stanga
	sol=0;
	for(i=2; i<n && !x[1][i] && !sol; i++)
	{
		sol=1;
		for(j=2; j<=m; j++)
			if(x[j][i])
				{sol=0;break;}
	}
	if(sol)
		{out<<1<<' '<<i-1<<' '<<m<<' '<<i-1;return 0;}
	
	// cazul 4 - doua directii, prima jos
	sol=0;
	for(i=2; i<m && !x[i][1] && !sol; i++)
	{
		sol=1;
		for(j=2; j<=n; j++)
			if(x[i][j])
				{sol=0;break;}
	}
	if(sol)
		{out<<i-1<<' '<<1<<' '<<i-1<<' '<<n;return 0;}
		
	// cazul 5 - nu avem solutie
	out<<-1;
	return 0;
}