poj 1979 zoj 2165 Red and Black 深搜做法
来源:互联网 发布:淘宝老酒拍卖会不会假 编辑:程序博客网 时间:2024/05/17 08:32
/*第一个深搜参考了大牛的代码并作了少许优化*/#define LOCAL#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<cctype>#include<iomanip>#include<string>#include<algorithm>#include<ctime>#include<stack>#include<queue>#include<vector>#define N 25using namespace std;int m,n,ans,rec[N][N],dir[4][2]={0,1,0,-1,1,0,-1,0}; //控制转向bool legal(int x,int y) //判断数据是否合法{if(x>=1&&x<=m&&y>=1&&y<=n) return true;return false;}void DFS(int x,int y) //递归搜索{int i,sx,sy;rec[x][y]=1;ans++;//标记当前点已经遍历过,每遍历一个节点ans+1for(i=0;i<4;i++) {sx=x+dir[i][0];sy=y+dir[i][1];//转向if(!rec[sx][sy]&&legal(sx,sy)) //若当前结点未被遍历且”合法“遍历该节点 DFS(sx,sy);}}int main(){#ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);#endif int i,j,x,y;char ch; while(cin>>n>>m&&m&&n) { memset(rec,0,sizeof(rec)); for(i=1;i<=m;i++){for(j=1;j<=n;j++){cin>>ch;if(ch=='#') rec[i][j]=1;else if(ch=='@') {x=i;y=j;}}} ans=0; DFS(x,y);cout<<ans<<endl; } return 0;}