Topic Type: Search
Sample input:
1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@**@@@@*@@@**@0 0
Sample output:
0122
Analysis:
This problem can be said to be one of the most basic problems in the search. To find out how many pieces are connected together, so, in order to enumerate, to encounter @ when the search, with deep search, wide search all line, the purpose is to connect the @ are marked as visited.
Below are the codes for DFS (deep search) and BFS (wide search)
DFS 1: Recursion
#include <iostream> #include <cstring> #include <cstdlib>using namespace Std;int m,n,idx[105][105]; Char pic[105][105];void dfs (int r,int c,int ID) { if (r<0 | | r>=m | | c<0 | | c>= n) return; if (Idx[r][c] >0 | | PIC[R][C]! = ' @ ') return; Idx[r][c] = id;for (int dr = -1;dr <= 1;dr++) {for (int dc = -1;DC <= 1;dc++) {if (dr! = 0 | | DC! = 0) dfs (r+dr,c+dc,id);}}} int main () {int I,j,cnt;while (cin>>m>>n,m&&n) {for (i=0;i<m;i++) {cin>>pic[i];} CNT = 0;memset (idx,0,sizeof (IDX)); for (i=0;i<m;i++) {for (j=0;j<n;j++) { if (idx[i][j]==0 && pic[i][j] = = ' @ ') dfs (i,j,++cnt);} }cout<<cnt<<endl;} return 0;}
This method may have a stack overflow when the amount of data is large
DFS 2: Stacks
#include <iostream> #include <cstring> #include <cstdlib> #include <stack>using namespace std; int M,n,idx[105][105];char pic[105][105];struct Node {int x;int y;}; stack<node> st;void dfs (int r,int c) {//if (r<0 | | r>=m | | c<0 | | c>= n) return;/if (Idx[r][c] & gt;0 | | PIC[R][C]! = ' @ ') return, while (!st.empty ()) St.pop (); Node temp;temp.x = R;TEMP.Y = C;st.push (temp); Idx[r][c] = 1;while (!st.empty ()) {temp = St.top (); St.pop (); for (int dr. = -1;dr <= 1;dr++) {for (int dc = -1;DC <= 1;dc++) {int DRR = Dr+temp.x;int DCC = dc+temp.y;if ((d R! = 0 | | DC! = 0) && drr>=0 && drr<m && dcc>=0 && dcc<n && PIC[DRR][DCC] = = ' @ ' &&!IDX[DRR][DCC])//dfs (r+dr,c+dc,id); {Node T;IDX[DRR][DCC] =1;t.x = Drr;t.y = Dcc;st.push (t);}}}} int main () {int I,j,cnt;while (cin>>m>>n,m&&n) {for (i=0;i<m;i++) {cin>>pic[i];} CNT = 0;memset (idx,0,sizeof (IDX)); for (i=0;i<m;i++) {for (j=0;j<n;j++) {if (idx[i][j]==0 && pic[i][j] = = ' @ ') {cnt++; DFS (I,J); }}}cout<<cnt<<endl;} return 0;}
BFS: (Queue Implementation) available STL can also array
#include <iostream> #include <cstring> #include <cstdlib> #include <stack> #include <queue >using namespace Std;int M,n,idx[105][105];char pic[105][105];struct Node {int X;int y;};/ /stack<node> St;//queue<node> St; Node que[105];void dfs (int r,int c) {//if (r<0 | | r>=m | | c<0 | | c>= n) return;/if (Idx[r][c] >0 | | PIC[R][C]! = ' @ ') return;//while (!st.empty ()) St.pop (); que[0].x = R;que[0].y = C;idx[r][c] = 1;int front=0;int rear=1;wh Ile (Front < rear) {Node temp=que[front++];for (int dr = -1;dr <= 1;dr++) {for (int dc = -1;DC <= 1;dc++) {in T DRR = dr+temp.x;int DCC = dc+temp.y;if ((dr! = 0 | | DC! = 0) && drr>=0 && drr<m && dcc>= 0 && dcc<n && pic[drr][dcc] = = ' @ ' &&!IDX[DRR][DCC]) {IDX[DRR][DCC] =1;que[rear].x = drr;que[r Ear].y = dcc;rear++;}}}} int main () {int I,j,cnt;while (cin>>m>>n,m&&n) {for (i=0;i<m;i++) {cin>>pic[i];} CNT = 0;memset (idx,0,sizeof (IDX)); for (i=0;i<m;i++) {for (j=0;j<n;j++) {if (idx[i][j]==0 && pic[i][j] = = ' @ ') {cnt+ +; DFS (I,J); }}}cout<<cnt<<endl;} return 0;}
UVA 572 Search for a first-knowledge BFS DFS