今天做了一道acm题,很水的,但是关于提高算法的,还是要老老实实的从基础做起。相信毕业之后会为自己的坚持而感到高兴的。
算法是我经过整合的,用了两种方法做的。
/***
author:zhangrong
date:2013/4/15
item: 利用广度优先算法与深度优先算法解
油田合并的问题
. 表示@有油
* 表示没油
一台采油机只能采连在一起的油田
**/
#include<iostream>
#define ROW 4
#define COL 4
using namespace std;
struct POINT
{
int x;int y;
}queue[100];
char map[ROW][COL+1]={
// "@*",
// "*@"
"@*@*",
"@@*@",
"*@**",
"@**@"
};
int can[ROW][COL];//深度优先算法用于检验是否已经存在
int dir[4][2]={1,0,0,1,-1,0,0,-1} ;// 方向
int bfs(int ,int ); //深度
int gfs(int,int); //广度
int main()
{
int count,i,j;
cout<<"使用深度算法:\n";
count=0;
memset(can,0,sizeof(can));
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++)
if(map[i][j]=='@'&&can[i][j]==0)
count+=bfs(i,j);
cout<<"the ans using bfs:"<<count<<endl;
cout<<"使用广度优先算法:";
memset(can,0,sizeof(can));
count=0;
for(i=0;i<ROW;i++)
for(j=0;j<COL;j++)
{
if(map[i][j]=='@'&&can[i][j]==0)
count+=gfs(i,j);
}
cout<<"the ans using gfs:"<<count<<endl;
return 0;
}
int bfs(int i,int j)
{
can[i][j]=1;
int t1,t2;
for(int k=0;k<4;k++)
{
t1=i+dir[k][0];
t2=j+dir[k][1];
if(map[t1][t2]=='@'&&can[t1][t2]==0&&t1<ROW&&t1>=0&&t2>=0&&t2<COL) //
bfs(t1,t2);
}
return 1;
}
int gfs(int x,int y)
{
can[x][y]=1;
int t,w,t1,t2,tx,ty;
t=0;w=0;
queue[t].x=x;
queue[t].y=y;
while(t<=w)
{
t1=queue[t].x;
t2=queue[t].y;
for(int loop=0;loop<4;loop++)
{
tx=t1+dir[loop][0];
ty=t2+dir[loop][1];
if(map[tx][ty]=='@'&&can[tx][ty]==0&&tx>=0&&tx<ROW&&ty>=0&&ty<COL)
{
can[tx][ty]=1;
queue[++w].x=tx;
queue[w].y=ty;
}
}
++t;
}
return 1;
}