这题一开始没看太懂,但想到可能要用深度优先来遍历。因为题目一开始就规定只有两个岛,首先需要通过深度优先 找到第一个岛,在通过广度遍历来找第二个岛,广度优先的次数即为需要翻转的个数。
void DFS(int **grid,int gridSize,int i,int j,int *Queue,int *rear){
if(i<0||i>=gridSize||j<0||j>=gridSize||grid[i][j]!=1){
return;
}
Queue[(*rear)++]=i*gridSize+j;
grid[i][j]=-1;
DFS(grid,gridSize,i-1,j,Queue,rear);
DFS(grid,gridSize,i+1,j,Queue,rear);
DFS(grid,gridSize,i,j-1,Queue,rear);
DFS(grid,gridSize,i,j+1,Queue,rear);
return;
}
int shortestBridge(int** grid, int gridSize, int* gridColSize){
int *Queue=(int*)malloc(sizeof(int)*gridSize*gridSize);
int front,rear,i,j,xx,yy,num,x,y;
front=rear=0;
int flag=0,step;
int xy[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
//用深度优先DFS寻找第一个岛屿
for(i=0;i<gridSize;i++){
for(j=0;j<gridSize;j++){
if(grid[i][j]==1){
DFS(grid,gridSize,i,j,Queue,&rear);
flag=1;break;
}
}
if(flag==1){
break;
}
}
step=0;
//广度优先BFS从第一个岛屿向外扩张
while(front!=rear){
num=rear-front;
for(j=1;j<=num;j++){
x=Queue[front]/gridSize;
y=Queue[front]%gridSize;
front++;
for(i=0;i<4;i++){
xx=x+xy[i][0];
yy=y+xy[i][1];
if(xx<0||xx>=gridSize||yy<0||yy>=gridSize||grid[xx][yy]==-1){
continue;
}
if(grid[xx][yy]==1){
return step;
}
grid[xx][yy]=-1;
Queue[rear++]=xx*gridSize+yy;
}
}
step++;
}
free(Queue);
return step;
}