杭电1010题

来源:互联网 发布:网络智能家居 编辑:程序博客网 时间:2024/05/21 14:49


#include<iostream>#include<vector>using namespace std;class Point{public:int x;int y;Point():x(0),y(0){}Point(int a, int b):x(a),y(b){}};/*-1 sink block0 empty block1 start point 2 block of wall3 doorfor vecMap[x][y]move x -- up or downmove y -- left or right*/bool FindWay(Point pStart, vector< vector<int> > vecMap, vector<Point> vecRount, int iTime, Point pDoor){//从pStart出发,上下左右开始走,加入vecRountif(pStart.x == pDoor.x && pStart.y == pDoor.y){if(iTime == vecRount.size()){cout << "TRUE" << endl;return true;}return false;}if(iTime == vecRount.size() ){/*if(3 == vecMap[pStart.x][pStart.y]){cout << "TRUE" << endl;return true;}cout << "WRONG" << endl;for(int i = 0 ; i < vecRount.size(); i++){cout << vecRount[i].x <<"-" << vecRount[i].y << "  "; }cout << endl;*/return false;}bool boFindWay = false;/*find way-get new start-get new rount-find */if( (0 <= pStart.x - 1) && (0 == vecMap[pStart.x - 1][pStart.y] || 3 == vecMap[pStart.x - 1][pStart.y]))  // to up{//cout << " up " << endl;Point pNext(pStart.x - 1, pStart.y);vector<Point> vecNextRount(vecRount);vecNextRount.push_back(pNext);//cout << pNext.x  << " ___ "<< pNext.y << endl;vecMap[pNext.x][pNext.y] = -1;boFindWay = FindWay(pNext, vecMap, vecNextRount, iTime, pDoor);if(boFindWay == true){return boFindWay;}} //up_loopif((vecMap.size() > pStart.x + 1 )&& (0 == vecMap[pStart.x + 1][pStart.y] || 3 == vecMap[pStart.x + 1][pStart.y]))    // to down{//cout << " down " << endl;Point pNext(pStart.x + 1, pStart.y);vector<Point> vecNextRount(vecRount);vecNextRount.push_back(pNext);//cout << pNext.x  << " ___ "<< pNext.y << endl;vecMap[pNext.x][pNext.y] = -1;boFindWay = FindWay(pNext, vecMap, vecNextRount, iTime, pDoor);if(boFindWay == true){return boFindWay;}} //down_loopif( (0 <= pStart.y - 1 )&& (0 == vecMap[pStart.x][pStart.y - 1] || 3 == vecMap[pStart.x][pStart.y - 1]))    // to left{//cout << " left " << endl;Point pNext(pStart.x, pStart.y - 1);vector<Point> vecNextRount(vecRount);vecNextRount.push_back(pNext);//cout << pNext.x  << " ___ "<< pNext.y << endl;vecMap[pNext.x][pNext.y] = -1;boFindWay = FindWay(pNext, vecMap, vecNextRount, iTime, pDoor);if(boFindWay == true){return boFindWay;}} //left_loopif( (vecMap[0].size() > pStart.y + 1)&& (0 == vecMap[pStart.x][pStart.y + 1] || 3 == vecMap[pStart.x][pStart.y + 1]))    // to right{//cout << " right " << endl;Point pNext(pStart.x, pStart.y + 1);vector<Point> vecNextRount(vecRount);  vecNextRount.push_back(pNext);//cout << pNext.x  << " ___ "<< pNext.y << endl;vecMap[pNext.x][pNext.y] = -1;boFindWay = FindWay(pNext, vecMap, vecNextRount, iTime, pDoor);if(boFindWay == true){return boFindWay;}} //right_loop/*for(int i = 0 ; i < vecRount.size(); i++){cout << vecRount[i].x <<"-" << vecRount[i].y << "  "; }cout << endl;*/return false;}int main(){int iLine, iRow;int iTime;while(cin >> iLine >> iRow >> iTime){if(0 == iLine && 0 == iRow && 0 == iTime){return 0;}else{char ch;vector< vector<int> > vecMap(iLine);for(int i = 0; i < iLine; i++){vector<int> vecRow(iRow);vecMap[i] = vecRow;} Point pStart, pDoor;for(int i = 0; i < iLine; i++){for(int j = 0; j < iRow; j++){cin >> ch;if('S' == ch){vecMap[i][j] = 1;pStart.x = i;pStart.y = j;}else if('.' == ch){vecMap[i][j] = 0;}else if('X' == ch){vecMap[i][j] = 2;}else if('D' == ch){vecMap[i][j] = 3;pDoor.x = i;pDoor.y = j;}}//for_loop}//for_loopfor(int i = 0; i < iLine; i++) {for(int j = 0; j < iRow; j++){cout << vecMap[i][j] << " ";}//for_loopcout << endl;}//for_loopvector<Point> vecRount;if(FindWay(pStart, vecMap, vecRount,iTime , pDoor) ){cout << "YES" << endl;}else{cout << "NO" << endl;}}//if_loop}//while_loopreturn 0;}

题目:点击打开链接

基本做法:让它随意游走,到时间在看是否走到门口,走到死胡同就回溯。不过,这样笨方法超时了。


参考答案:点击打开链接   (高手写的简单明了,技不如人啊)

原创粉丝点击