谷歌校园招聘在线笔试题题目一道
2013-10-14 16:49
344 查看
写一道吧,2013年第二轮第三题。
这一题在规定的时间内没有做出来,第二天看了一下题目,觉得可以做,谁知道这一做就是一天...
题意描述:
给定一个n*n的棋盘,如下图:
弱的
最后在编码的时候犯了很多很多的错误,很多很多的小细节,最后研究了将近一天,才弄明白怎么回事儿,最后还是那句话,等完全想明白了,再动手。
这一题在规定的时间内没有做出来,第二天看了一下题目,觉得可以做,谁知道这一做就是一天...
题意描述:
给定一个n*n的棋盘,如下图:
#include <iostream> #include <cstring> using namespace std; const int MAXSIZE = 100+5; char map[MAXSIZE][MAXSIZE]; int state[MAXSIZE*MAXSIZE+4]; const int nextX[] = {-1,-1,0,0,1,1}; const int nextY[] = {0,1,-1,1,-1,0}; int n,R,B; int UP,LEFT,DOWN,RIGHT; int F( int x ) { int t = x; while ( state[t] != t ) { t = state[t]; } return t; } void U( int x, int y ) { if ( x != y ) { int fx = F(x); int fy = F(y); if ( fx != fy ) { state[fy] = fx; } } } void input(){ cin>>n; R = 0; B = 0; UP = n*n; LEFT = UP+1; DOWN = LEFT+1; RIGHT = DOWN+1; memset(map,0,sizeof(map)); for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < n; j++ ) { cin>>map[i][j]; if ( map[i][j] == 'R' ) { R++; } else if ( map[i][j] == 'B' ) { B++; } } } } int inrange(int x, int y ) { return ( ( x >= 0 ) && ( x < n ) && ( y >= 0 ) && ( y < n ) ); } void check(int x, int y, int nx, int ny){ if ( ! ( inrange(x,y) && inrange(nx,ny) ) ){ return; } if ( map[x][y] == map[nx][ny] ) { U(x*n+y,nx*n+ny); } return; } int flood(){ memset(state,0,sizeof(state)); for ( int i = 0; i < MAXSIZE*MAXSIZE+4; i++ ) { state[i] = i; } for ( int i = 0; i < n; i++ ){ if ( map[0][i] == 'R' ) { U(UP,i); } if ( map[n-1][i] == 'R' ) { U(DOWN,n*(n-1)+i); } if ( map[i][0] == 'B' ) { U(LEFT,i*n); } if ( map[i][n-1] == 'B' ) { U(RIGHT,i*n+n-1); } } for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < n; j++ ) { if ( map[i][j] != '.' ) { for ( int k = 0; k < 6; k++ ) { int nx = i+nextX[k]; int ny = j+nextY[k]; check(i,j,nx,ny); } } // for ( int k = 0; k < n*n; k++ ){ //if ( k % n == 0 ) cout<<endl; // cout<<state[k]<<" "; //} //cout<<"~~~~~\n"; } } } int Bwin(){ return F(LEFT) == F(RIGHT); } int Rwin(){ return F(UP) == F(DOWN); } int possible(){ int t = R-B; int rw = Rwin(); int bw = Bwin(); t = t > 0? t:-t; // cout<<state[UP]<<" "<<state[LEFT]<<" "<<state[DOWN]<<" "<<state[RIGHT]<<endl; //cout<<rw<<" "<<bw<<" "<<t<<endl; if ( t > 1 ) { return 0; } if ( rw && bw ){ return 0; } if ( rw && ( B > R ) ) { return 0; } if ( bw && ( R > B ) ) { return 0; } if ( rw || bw ){ int mark = 0; for ( int i = 0; i < n; i++ ) { for ( int j = 0; j < n; j++ ){ if ( rw && ( map[i][j] == 'R' ) ){ map[i][j] = '.'; flood(); if ( !Rwin() ){ mark ++; } map[i][j] = 'R'; } if ( bw && ( map[i][j] == 'B' ) ) { map[i][j] = '.'; flood(); if ( !Bwin() ){ mark ++; } map[i][j] = 'B'; } if ( mark != 0 ) return 1; } } if ( mark == 0 ) return 0; } return 1; } void solve(int x) { input(); flood(); int rw = Rwin(); int bw = Bwin(); cout<<"Case #"<<x<<": "; if ( !possible() ) { cout<<"Impossible\n"; return; } if ( bw ) { cout<<"Blue wins\n"; return; } if ( rw ) { cout<<"Red wins\n"; return; } cout<<"Nobody wins\n"; return; } int main(){ int t; cin>>t; for ( int i = 1; i <= t; i++ ) { solve(i); } return 0; }
弱的
最后在编码的时候犯了很多很多的错误,很多很多的小细节,最后研究了将近一天,才弄明白怎么回事儿,最后还是那句话,等完全想明白了,再动手。
相关文章推荐
- 微软2015校园招聘 技术类职位在线笔试-题目1 : Browser Caching
- 阿里巴巴2014校园招聘笔试最后一道题目
- 2017微软秋季校园招聘在线编程笔试 题目2 Composition
- 2012校园招聘的一道笔试题目
- 微软2016校园招聘9月在线笔试-题目3 : Fibonacci
- 微软2016校园招聘4月在线笔试题目解析
- 微软2016校园招聘在线笔试题目-第一题 Magic Box
- 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings
- 阿里巴巴2014校园招聘笔试最后一道题目
- 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings
- 题目3 : Spring Outing 微软2016校园招聘在线笔试第二场
- 网易互娱2017实习生招聘在线笔试第一场-题目3
- 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目
- 2017微软秋季校园招聘在线编程笔试-#1401 : Registration Day
- 微软2016校园招聘4月在线笔试 总结
- hihocoder 1288:Font Size--微软2016校园招聘4月在线笔试
- 2015年校园招聘之腾讯(数据挖掘)笔试面试题目
- 2011-10-15腾讯校园招聘笔试题目与参考答案
- 微软2016校园招聘在线笔试第二场
- 2013谷歌校园招聘笔试题2