您的位置:首页 > 其它

谷歌校园招聘在线笔试题题目一道

2013-10-14 16:49 344 查看
写一道吧,2013年第二轮第三题。

这一题在规定的时间内没有做出来,第二天看了一下题目,觉得可以做,谁知道这一做就是一天...

题意描述:

给定一个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;
}


弱的

最后在编码的时候犯了很多很多的错误,很多很多的小细节,最后研究了将近一天,才弄明白怎么回事儿,最后还是那句话,等完全想明白了,再动手。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: