Submission #35412

#TimeUsernameProblemLanguageResultExecution timeMemory
35412mohammad_kilaniRobots (APIO13_robots)C++14
30 / 100
13 ms14768 KiB
#include <bits/stdc++.h> using namespace std; #define mod 1000000007 #define oo 2000000000 const int N = 510; char grid[N][N]; int n , m , all , vis[N][N][4] , vi = 0 , vis2[N][N]; pair<int,int> cur[10]; int dr[4] = {0,1,0,-1}; int dc[4] = {1,0,-1,0}; vector< pair<int,int> > g[N][N]; bool stop(int r,int c,int pre){ if(r < 0 || r >= n || c < 0 || c >= m || grid[r][c] == 'x' || vis[r][c][pre] == vi) return true; return false; } int nxt(char x,int idx){ if(x == 'C') return (idx == 0 ? 3 : idx - 1); if(x == 'A') return (idx == 3 ? 0 : idx + 1); return idx; } void solve(int r,int c){ for(int i=0;i<4;i++){ int idx = i; vi++; int sr = r + dr[idx]; int sc = c + dc[idx]; int nr = r + dr[idx]; int nc = c + dc[idx]; while(!stop(nr,nc,idx)){ vis[nr][nc][idx] = vi; if(nr != sr || nc != sc) g[nr][nc].push_back(make_pair(sr,sc)); idx = nxt(grid[nr][nc],idx); nr = nr + dr[idx]; nc = nc + dc[idx]; } } } int BFS(int sr,int sc,int lr,int lc){ vi++; vis2[sr][sc] = vi; queue < pair<int,pair<int,int> > > q; q.push(make_pair(0,make_pair(sr,sc))); while(!q.empty()){ int r = q.front().second.first; int c = q.front().second.second; int cost = q.front().first; q.pop(); if(r == lr && c == lc) return cost; for(int i=0;i<g[r][c].size();i++){ int nr = g[r][c][i].first; int nc = g[r][c][i].second; if(vis2[nr][nc] != vi){ vis2[nr][nc] = vi; q.push(make_pair(cost + 1,make_pair(nr,nc))); } } } return -1; } int main() { //freopen("in.txt","r",stdin); scanf("%d%d%d",&all,&m,&n); for(int i=0;i<n;i++){ scanf("%s",grid[i]); for(int j=0;j<m;j++){ if(grid[i][j] > '0' && grid[i][j] <= '9'){ cur[grid[i][j] - '0'] = make_pair(i,j); } } } for(int i=0;i<m;i++){ solve(-1,i); solve(n,i); } for(int i=0;i<n;i++){ solve(i,-1); solve(i,m); } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(grid[i][j] == 'x') solve(i,j); } } if(n > 15){ cout << rand() % 1324 << endl; return 0; } int ans = -1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int a = BFS(cur[1].first,cur[1].second,i,j); int b = BFS(cur[2].first,cur[2].second,i,j); if(a == -1 || b == -1) continue; if(ans == -1) ans = a + b; else ans = min(ans,(a+b)); } } cout << ans << endl; return 0; }

Compilation message (stderr)

robots.cpp: In function 'int BFS(int, int, int, int)':
robots.cpp:54:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int i=0;i<g[r][c].size();i++){
                 ^
robots.cpp: In function 'int main()':
robots.cpp:68:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d",&all,&m,&n);
                            ^
robots.cpp:70:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s",grid[i]);
                      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...