Submission details
Task:Jelly Raid
Sender:wavelets
Submission time:2015-11-25 20:43:38 +0200
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.06 sdetails
#2ACCEPTED0.34 sdetails
#3ACCEPTED0.45 sdetails
#4ACCEPTED0.43 sdetails
#50.06 sdetails
#6ACCEPTED0.46 sdetails
#70.14 sdetails

Compiler report

input/code.cpp: In lambda function:
input/code.cpp:95:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < masters.size(); ++i)
                       ^
input/code.cpp:99:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      if (idx >= m.size())
              ^
input/code.cpp: In function 'int main()':
input/code.cpp:31:35: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d\n", &rows, &columns);
                                   ^
input/code.cpp:34:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("(%d %d)\n", &srow, &scolumn);
                                     ^
input/code.cpp:35:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result...

Code

#include <iostream>
#include <vector>
#include <cstdio>
#include <queue>

using namespace std;

struct node
{
	int t;
	int row;
	int column;
	
	bool operator<(const node& o) const
	{
		return t > o.t;
	}
};

int main()
{
	const int MAGIC = 120;
		
	std::vector<int> s[60][60];
	for (int i = 0; i < 60; ++i)
	for (int j = 0; j < 60; ++j)
		s[i][j].assign(MAGIC, -1);
	
	int rows, columns;
//	cin >> rows >> cols;
	scanf("%d %d\n", &rows, &columns);
	
	int srow, scolumn, erow, ecolumn;
	scanf("(%d %d)\n", &srow, &scolumn);
	scanf("(%d %d)\n", &erow, &ecolumn);
	
	erow--;
	ecolumn--;
	srow--;
	scolumn--;
	
	char map[60][60];
	
	for (int i = 0 ; i < rows; ++i)
	{
		std::string line;
		cin >> line;
		for (int j = 0; j < columns; ++j)
		{
			map[i][j] = line[j];
		}
	}
	
	int master_count;
	scanf("%d\n", &master_count);
	
	vector<vector<pair<int, int>>> masters(master_count);
	
	for (int i = 0; i < master_count; ++i)
	{
		int steps = 0;
		scanf("%d",&steps);
		scanf(" ");
		masters[i].resize(steps);
		for (int j = 0; j < steps; ++j)
		{
			scanf("(%d %d)", &masters[i][j].first, &masters[i][j].second);
			scanf(" ");
			masters[i][j].first--;
			masters[i][j].second--;
		}
		scanf("\n");
	}
	
	priority_queue<node> q;
	q.push({0, srow, scolumn});
	while (!q.empty())
	{
		node n = q.top();
		q.pop();
		
//		cout << n.row << ", " << n.column << ", " << n.t << " going to " << erow << ", " << ecolumn << endl;
		
		if (n.row == erow && n.column == ecolumn)
		{
			cout << n.t << endl;
			return 0;
		}
		s[n.row][n.column][n.t % MAGIC] = n.t;
		
		auto test = [&rows, &columns, &s, &map, &q, &masters](int row, int column, int t)
		{
			if (row >= 0 && row < rows && column >= 0 && column < columns && s[row][column][t % MAGIC] == -1)
			{
				for (int i = 0; i < masters.size(); ++i)
				{
					auto& m = masters[i];
					int idx = t % (2*m.size()-2);
					if (idx >= m.size())
						idx = m.size()-1-(idx-m.size());
					auto pos = m[idx];
					
					if (row == pos.first)
					{
						int mi = min(column, pos.second);
						int ma = max(column, pos.second);
						bool safe = false;
						for (int c = mi; c <= ma; ++c)
						{
							if (map[row][c] == '#')
							{
								safe = true;
								break;
							}
						}
						if (!safe)
							return;
					}
					if (column == pos.second)
					{
						int mi = min(row, pos.first);
						int ma = max(row, pos.first);
						bool safe = false;
						for (int r = mi; r <= ma; ++r)
						{
							if (map[r][column] == '#')
							{
								safe = true;
								break;
							}
						}
						if (!safe)
							return;
					}
				}
			
			
				if (map[row][column] == '.')
				{
					s[row][column][t % MAGIC] = t;
					q.push({t, row, column});
				}
			}
		};
		
		test(n.row, n.column, n.t+1);
		test(n.row+1, n.column, n.t+1);
		test(n.row, n.column+1, n.t+1);
		test(n.row-1, n.column, n.t+1);
		test(n.row, n.column-1, n.t+1);
	}
	cout << "IMPOSSIBLE" << endl;	
}

Test details

Test 1

Verdict: ACCEPTED

input
60 3
(1 1) (54 3)
...
#..
...
...

correct output
3242

user output
3242

Test 2

Verdict: ACCEPTED

input
60 60
(1 1) (57 59)
.................................

correct output
1683

user output
1683

Test 3

Verdict: ACCEPTED

input
60 60
(1 1) (57 59)
...#...#.......#...#...#...#.....

correct output
2643

user output
2643

Test 4

Verdict: ACCEPTED

input
60 60
(1 1) (57 59)
...#...#...#...#...#...#...#.....

correct output
47043

user output
47043

Test 5

Verdict:

input
20 60
(10 1) (10 60)
...#...#...#...#...#.............

correct output
70

user output
71

Test 6

Verdict: ACCEPTED

input
60 60
(1 1) (57 59)
...#...#...#...#...#...#...#.....

correct output
27483

user output
27483

Test 7

Verdict:

input
60 60
(2 2) (58 40)
.................................

correct output
132

user output
(empty)