dfs搜索练习题 http://codeforces.com/problemset/problem/589/J

<strong><span style="font-size:18px;color:#ff0000;"><textarea readonly="readonly" name="code" class="c++"> 
</span></strong>
#include<iostream>
#include<string>
#include<cstdio>

using namespace std;

const int maxn=11;
int ans=1,flag;
int dir[4][2]={-1,0,0,1,1,0,0,-1}; //上,右,下,左
int w,h;                           //0,   1,  2,  3
char room[maxn][maxn];
bool used[maxn][maxn][4],mark[maxn][maxn];	
int mar=0,ii,jj;
int test=1;
void dfs(int direc,int x,int y){
	if(flag){
		return;
	}
	if(used[x][y][direc]){
		flag=1;
		return;
	}
	used[x][y][direc]=true;
	if(!mark[x][y]){
		ans++;
	}
	mark[x][y]=true;

	for(int i=0;i<4;i++){
		int xxxx=x+dir[(direc+i)%4][0],yyyy=y+dir[(direc+i)%4][1];
		if(xxxx>=0&&xxxx<w&&yyyy>=0&&yyyy<h&&room[ xxxx ][ yyyy ]=='.'){
		    //cout<<test++<<" "<<(direc+i)%4<<" "<<xxxx<<" "<<yyyy<<endl;
			dfs( (direc+i)%4,xxxx,yyyy );	
		}
	}
}

int main(){
	//freopen("D:\\in.txt","r",stdin);
	cin>>w>>h;
	for(int i=0;i<w;i++){
		cin>>room[i];
	}
	
	for(int i=0;i<w;i++){
		for(int j=0;j<h;j++){
			if(room[i][j]!='.'&&room[i][j]!='*'){
				if(room[i][j]=='U'){
					mar=0;
				}
				else if(room[i][j]=='R'){
					mar=1;
				}
				else if(room[i][j]=='D'){
					mar=2;
				}
				else{
					mar=3;
				}
				ii=i,jj=j;
				break;
			}
		}
	}
	
	used[ii][jj][mar]=true;
	mark[ii][jj]=true;
	room[ii][jj]='.';  //没有这句第十五组测试数据跪了 
	
	for(int i=0;i<4;i++){
		int xxx=ii+dir[(mar+i)%4][0],yyy=jj+dir[(mar+i)%4][1];
		if(xxx>=0&&xxx<w&&yyy>=0&&yyy<h&&room[ xxx  ][ yyy  ]=='.'){
			//cout<<test++<<" "<<(mar+i)%4<<" "<<xxx<<" "<<yyy<<endl;
			dfs( (mar+i)%4,xxx,yyy );		
		}
	}
	cout<<ans<<endl;
	
	return 0;
} 
<strong><span style="font-size:18px;color:#ff0000;"></textarea> 
</span></strong>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值