Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Eternal Truths - UVA - 928
- //BFS
- #include<iostream>
- #include<fstream>
- #include<climits>
- #include<cstring>
- #include<queue>
- using namespace std;
- char graph[301][301];
- int visited[301][301][3];
- int xmov[4] = { -1,0,0,1 };
- int ymov[4] = { 0,-1,1,0 };
- bool issafe(char graph[301][301], int r, int c, int x, int y) {
- if (x >= 1 && x <= r && y >= 1 && y <= c && graph[x][y] != '#') return true;
- return false;
- }
- void initialize(int arr[301][301][3]) {
- for (int i = 0; i < 301; i++)
- for (int j = 0; j < 301; j++)
- for (int k = 0; k < 3; k++)
- arr[i][j][k] = 0;
- }
- int main() {
- ifstream in;
- ofstream out;
- in.open("file.txt");
- out.open("output.txt");
- int t,r,c,xst,yst,xend,yend;
- in >> t;
- while (t--) {
- initialize(visited);
- in >> r >> c;
- for (int i = 1; i <= r; i++)
- for (int j = 1; j <= c; j++){
- in >> graph[i][j];
- if (graph[i][j] == 'S') xst = i, yst = j;
- if (graph[i][j] == 'E') xend = i, yend = j;
- }
- queue<int> q;
- q.push(xst);
- q.push(yst);
- q.push(1);
- visited[xst][yst][0] = 1;
- int xtemp, ytemp,ltemp ;
- bool flagg = false;
- while (!q.empty()) {
- xtemp = q.front();
- q.pop();
- ytemp = q.front();
- q.pop();
- ltemp = q.front();
- q.pop();
- if (xtemp == xend && ytemp == yend) {
- out << ltemp -1 <<endl;
- flagg = true;
- break;
- }
- for (int i = 0; i < 4; i++) {
- int xnext = xtemp, ynext = ytemp;
- bool flag = true;
- for (int j = 0; j <= (ltemp-1) % 3; j++) {
- xnext = xnext + xmov[i], ynext = ynext + ymov[i];
- if (issafe(graph, r, c, xnext, ynext)) continue;
- else {
- flag = false;
- break;
- }
- }
- if (flag == false) continue;
- if (!visited[xnext][ynext][(ltemp-1) % 3]) {
- visited[xnext][ynext][(ltemp-1) % 3] = 1;
- q.push(xnext);
- q.push(ynext);
- q.push(ltemp + 1);
- }
- }
- }
- if (!flagg) out << "NO" <<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement