ACM-尋寶
阿新 • • 發佈:2018-03-10
namespace span RR contain ner ble mem styles 矩形
題目描述:尋寶
有這麽一塊神奇的矩形土地,為什麽神奇呢?因為上面藏有很多的寶藏。該土地由N*M個小正方形土地格子組成,每個小正方形土地格子上,如果標有“E”,則表示該格可以通過;如果標有“X”,則表示該格不能通過。現在你處於其中的一格上,用“P”表示,你只能向與你所在格子相鄰的上、下、左、右四個方向移動,當然如果你即將移向的格子上標有“X”,則不能通過。現在的任務是:如果你能從起點通過每個用“E”標示的格子一次且僅一次,則你將尋寶成功,否則則失敗。
輸入
輸入包括如下幾部分。 第一部分:輸入兩個數N(1<=N<=6)和M(1<=M<=6),分別表示該土地的行和列。 第二部分:輸入一個只能由“P”、“X”、“E”構成的N*M大小的矩陣,且“P”只能出現一次,代表你當前所在位置。
輸出
如果能尋寶成功,輸出“YES”;否則輸出“NO”。
樣例輸入
2 2 PE ES 4 4 PXEE EXEE EEEE EEEE
樣例輸出
NO YES
思路:簡單的DFS。
#include <iostream> #include <cstring> using namespace std; int dis[4][2]={-1,0,0,-1,1,0,0,1},vis[10][10]; char map[10][10]; int n,m,sum,flag; void init() { memset(vis,0,sizeof(vis)); memset(map,‘\0‘,sizeof(map)); sum=flag=0; } void dfs(int x,int y,int cnt) {if(cnt==sum) { flag=1; return; } if(flag) return ; int i,tx,ty; for(i=0;i<4;i++) { tx=x+dis[i][0]; ty=y+dis[i][1]; if(tx>=0 && ty>=0 && tx<n && ty<m && map[tx][ty]!=‘X‘ && !vis[tx][ty]) { vis[tx][ty]=1; dfs(tx,ty,cnt+1); vis[tx][ty]=0; } } } int main() { int i,j; while(cin>>n>>m) { init(); for(i=0;i<n;i++) cin>>map[i]; int tx,ty; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(map[i][j]==‘P‘) tx=i,ty=j; else if(map[i][j]==‘E‘) sum++; } } vis[tx][ty]=1; dfs(tx,ty,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
ACM-尋寶