6 9<br>....#.<br>.....#<br>......<br>......<br>......<br>......<br>......<br>#@...#<br>.#..#.<br>11 9<br>.#.........<br>.#.#######.<br>.#.#.....#.<br>.#.#.###.#.<br>.#.#..@#.#.<br>.#.#####.#.<br>.#.......#.<br>.#########.<br>...........<br>11 6<br>..#..#..#..<br>..#..#..#..<br>..#..#..###<br>..#..#..#@.<br>..#..#..#..<br>..#..#..#..<br>7 7<br>..#.#..<br>..#.#..<br>###.###<br>...@...<br>###.###<br>..#.#..<br>..#.#..<br>0 0<br>
45<br>59<br>6<br>13<br>
题意:有红、黑两种颜色,只能走黑色,上、下、左、右走。求走过的黑色的。
思路:dfs,注意走过的地方。
代码:
#include <iostream> #include<stdlib.h> #include<string.h> #include<fstream> using namespace std; char a[25][25]; int flag[25][25]; int sum; void DFS(int x,int y) { if(a[x-1][y]=='.' && flag[x-1][y]==0) { sum++; flag[x-1][y]=1; DFS(x-1,y); } if(a[x][y-1]=='.' && flag[x][y-1]==0) { sum++; flag[x][y-1]=1; DFS(x,y-1); } if(a[x][y+1]=='.' && flag[x][y+1]==0) { sum++; flag[x][y+1]=1; DFS(x,y+1); } if(a[x+1][y]=='.' && flag[x+1][y]==0) { sum++; flag[x+1][y]=1; DFS(x+1,y); } } int main() { freopen ("C:\\Users\\liuzhen\\Desktop\\11.txt", "r", stdin); int n,m,i,j; while(cin>>m>>n) { if(m==0&&n==0) break; sum=0; memset(flag,0,sizeof(flag)); memset(a,'#',sizeof(a)); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(a[i][j]=='@') { sum++; flag[i][j]=1; DFS(i,j); i=n; j=m; } } } cout<<sum<<endl; } freopen ("con", "r", stdin); system("pause"); return 0; }