1. 程式人生 > >ACM-尋寶

ACM-尋寶

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-尋寶