杭电ACM1010(dfs+剪枝)

来源:互联网 发布:ps制作淘宝详情页 编辑:程序博客网 时间:2024/05/06 17:32

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

题目大意:一只小狗被困在了一座迷宫中,迷宫有一个起点和一个终点,“X”代表墙,不能通行,“.”代表通路,迷宫终点的门只在特定时间开启一瞬间,因此小狗必须在这个时刻到达终点才能逃生。给出迷宫的地图和门开启的时间k,要求计算小狗是否能逃生,若能输出YES,不能输出NO。

解题思路:搜索,dfs+剪枝。

AC代码:

#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;char graph[10][10];int sx,sy,dx,dy,n,m,k;bool flag;bool visit[10][10];int turn[4][2] = {1,0,-1,0,0,1,0,-1};void dfs(int x,int y,int count){int mx,my;if(x==dx&&y==dy&&count==k){flag=1;return ;}if(count>=k)return ;if(graph[x][y]!='X'){for(int i=0;i<4;i++){mx = x+turn[i][0];my = y+turn[i][1];if(graph[mx][my]!='X'&&mx>=1&&mx<=n&&my>=1&&my<=m&&!visit[mx][my]){visit[mx][my] = 1;dfs(mx,my,count+1);visit[mx][my] = 0;if(flag)return ;}}}}int main(){int count;while(cin>>n>>m>>k){if(n==0&&m==0&&k==0)break;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>graph[i][j];if(graph[i][j]=='S'){sx = i;sy = j;}if(graph[i][j]=='D'){dx = i;dy = j;}}}if(abs(sx-dx)+abs(sy-dy)>k||(sx+sy+dx+dy+k)%2==1){cout<<"NO"<<endl;continue;}memset(visit,0,sizeof(visit));count=0;flag=0;visit[sx][sy] = 1;dfs(sx,sy,count);if(flag)cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;}

0 0
原创粉丝点击