ACM题解报告——HD1241

  今天解了杭电OJ1241题,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241

  题目的大体意思就是找出不同的油田数量并输出,注意相邻的油井都属于同一块油田(ps:它的相邻也包括左上,左下,右上,右下,开始读题目半天都没搞懂这个,囧死了)。

这题可以用搜索来解决,这里我分别用了深搜和广搜AC了一遍:

深搜代码:

#include<iostream>
using namespace std; int map[105][105],m,n; int fx[8]={-1,-1,-1,0,0,1,1,1},fy[8]={-1,1,0,1,-1,1,-1,0}; int check(int a,int b,int k) { int flag=1; a+=fx[k]; b+=fy[k]; if(a<1||a>m||b<1||b>n) flag=0; if(map[a][b]==0) flag=0; return flag; } void dfs(int a,int b) { int i; int newx,newy; for(i=0;i<8;i++) { if(check(a,b,i)==1) { newx=a+fx[i]; newy=b+fy[i]; map[newx][newy]=0; dfs(newx,newy); } } } int main( ) { int i,j; char ch; while(cin>>m>>n&&(m||n)) { int count=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>ch; if(ch=='@')  map[i][j]=1; if(ch=='*')   map[i][j]=0; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(map[i][j]) { count++; dfs(i,j); } } cout<<count<<endl; } return 0; }

广搜代码:

#include<iostream>
using namespace std; int map[105][105],m,n; int fx[8]={-1,-1,-1,0,0,1,1,1},fy[8]={-1,1,0,1,-1,1,-1,0}; typedef struct { int x; int y; }Node; Node node[10005]; int check(int a,int b,int k) { int flag=1; a+=fx[k]; b+=fy[k]; if(a<1||a>m||b<1||b>n) flag=0; if(map[a][b]==0) flag=0; return flag; } void bfs(int a,int b) { int i,head,tail; head=0; tail=1; node[1].x=a; node[1].y=b; while( head!=tail) { head++; for(i=0;i<8;i++) { if(check(node[head].x,node[head].y,i)==1) { tail++; node[tail].x=node[head].x+fx[i]; node[tail].y=node[head].y+fy[i]; map[node[tail].x][node[tail].y]=0; } } } } int main( ) { int i,j; char ch; while(cin>>m>>n&&(m||n)) { int count=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { cin>>ch; if(ch=='@')  map[i][j]=1; if(ch=='*')   map[i][j]=0; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) { if(map[i][j]) { count++; bfs(i,j); } } cout<<count<<endl; } return 0; }

 

思维量不是很大的题目

你可能感兴趣的:(ACM)