USACO Snail Trails 解题报告

来源:互联网 发布:武汉矩阵互动 编辑:程序博客网 时间:2024/06/05 20:44

这道题就是一道DFS搜索题,我是按照自己习惯的方式进行的,进去之后就mark,出来前unmark。主要是需要看清题,即如果能走的话一直往前走,否则,需要看是否遇到障碍了,如果遇到的是之前走过的点就只能停了。前者的情况可以左转或右转。所以这道题我也保留了方向。

/* ID: thestor1 LANG: C++ TASK: snail */#include <iostream>#include <fstream>  #include <cmath>  #include <cstdio>  #include <cstring>  #include <climits>  #include <cassert>  #include <string>  #include <vector>  #include <set>#include <map>  #include <queue>  #include <stack>  #include <algorithm>using namespace std;bool isIn(int r, int c, int N){return 0 <= r && r < N && 0 <= c && c < N;}void search(vector<std::vector<int> > &grid, int r, int c, int d, int cnt, int &largest){// cout<<"[debug]r: "<<r<<", c: "<<c<<endl;if (cnt > largest){largest = cnt;// cout<<"[debug]largest: "<<largest<<endl;}grid[r][c] = 1;int N = grid.size();int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};int nr = r + dx[d], nc = c + dy[d];if (isIn(nr, nc, N) && !grid[nr][nc]){search(grid, nr, nc, d, cnt + 1, largest);}else if (!isIn(nr, nc, N) || grid[nr][nc] == 2){int turn[] = {-1, 1};for (int t = 0; t < 2; ++t){int nd = (d + 4 + turn[t]) % 4;nr = r + dx[nd];nc = c + dy[nd];if (isIn(nr, nc, N) && !grid[nr][nc]){search(grid, nr, nc, nd, cnt + 1, largest);}}}grid[r][c] = 0;}int main(){ifstream fin("snail.in");ofstream fout("snail.out");int N, B;fin>>N>>B;std::vector<std::vector<int> > grid(N, std::vector<int>(N, 0));for (int i = 0; i < B; ++i){char c;int r;fin>>c>>r;// cout<<"r: "<<r<<", c: "<<c<<endl;grid[r - 1][c - 'A'] = 2;}grid[0][0] = 1;// for (int r = 0; r < N; ++r)// {// for (int c = 0; c < N; ++c)// {// if (grid[r][c])// {// cout<<'#';// }// else// {// cout<<'.';// }// }// cout<<endl;// }int largest = 0;search(grid, 0, 0, 1, 1, largest);// cout<<"[debug]after first search: "<<endl;// for (int r = 0; r < N; ++r)// {// for (int c = 0; c < N; ++c)// {// if (grid[r][c])// {// cout<<'#';// }// else// {// cout<<'.';// }// }// cout<<endl;// }search(grid, 0, 0, 2, 1, largest);fout<<largest<<endl;fin.close();fout.close();return 0;  }


0 0
原创粉丝点击