tempter of the bone

题意

给你n,m,t,一个n*m矩阵
S代表起点,D代表终点,X代表墙,问是否可以刚好t步走到,而且走过的路不能重复走

分析

DFS

代码

#include<iostream>
#include<algorithm>
using namespace std;
int n,m,t,sx,sy,ex,ey;
char mp[10][10];
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool ok;
void dfs(int si,int sj,int cnt){
	int i,tem;
	if(si<1||si>n||sj<1||sj>m) return;//越界 
	if(si==ex&&sj==ey&&cnt==t){//到达 
		ok=1; return;
	}
	tem=((t-cnt)-abs(si-ex)-abs(sj-ey));
	if(tem<0||tem&1) return;//奇偶剪枝 
	for(i=0;i<4;i++){//四个方向 
		if(mp[si+d[i][0]][sj+d[i][1]]!='X'){
			mp[si+d[i][0]][sj+d[i][1]]='X';//避免重复 
			dfs(si+d[i][0],sj+d[i][1],cnt+1);
			if(ok) return;
			mp[si+d[i][0]][sj+d[i][1]]='.';//恢复 
		}
	}
	return;
}
int main(){
	//freopen("in.txt","r",stdin);
	while(cin>>n>>m>>t&&(m+n+t)){ 
		int cnt=0;
		char c;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)
		{
			cin>>mp[i][j];
			if(mp[i][j]=='S') sx=i,sy=j;
			if(mp[i][j]=='X') cnt++;
			if(mp[i][j]=='D') ex=i,ey=j;
		}
		}
		ok=0;
		if(m*n-cnt<=t){//剩下的不是墙的少于t,注意开始的位置
		//也不是墙,所以是小于等于 
			cout<<"NO\n"; continue;
		}
		mp[sx][sy]='X';
		dfs(sx,sy,0);
	  if(ok) cout<<"YES\n";
	  else cout<<"NO\n";
	}
	return 0;
}
posted @ 2018-12-05 14:11  ChunhaoMo  阅读(159)  评论(0编辑  收藏  举报