UVA 705-Slash Maze

来源:互联网 发布:建站abc 收费 编辑:程序博客网 时间:2024/05/16 07:33

UVA 705-Slash Maze

题目大意:由/和\形成迷宫,求有几个回路和最大回路的路长

解题思路:把一个格子扩大俩倍,然后dfs求解

#include <stdio.h>#include <iostream>#include <string.h>using namespace std;int map[400][400];char ch[100][100];int flag[400][400];int w, h;int o1, o2;int sum, len;int dir[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};void change() {    for(int i = 0; i < h; i++)        for(int j = 0; j < w; j++) {            if(ch[i][j] == '\\') {                map[i*2][j*2] = 1;                map[i*2+1][j*2+1] = 1;            }            else if(ch[i][j] == '/') {                map[i*2+1][j*2] = 2;                map[i*2][j*2+1] = 2;            }        }    w = w * 2;    h = h * 2;}void dfs(int a, int b, int l) {    l++;    flag[a][b] = 1;    for(int i = 0; i < 4; i++) {        if(a + dir[i][0] >= 0 && a + dir[i][0] < h && b + dir[i][1] >= 0 && b + dir[i][1] < w) {            int p = a + dir[i][0], q = b + dir[i][1];            if(map[p][q] == 0) {                if(flag[p][q] == 0)                    dfs(p, q, l);                else if(p == o1 && q == o2 && l >= 4) {                    sum++;                    if(l > len)                        len = l;                }            }        }    }    for(int i = 4; i < 8; i++) {        if(a + dir[i][0] >= 0 && a + dir[i][0] < h && b + dir[i][1] >= 0 && b + dir[i][1] < w) {            int p = dir[i][0], q = dir[i][1];            int k;            if(p * q == 1)                k = 2;            else if(p * q == -1)                k = 1;            if((map[a+p][b] != k || map[a][b+q] != k) && map[a+p][b+q] == 0) {                if(flag[a+p][b+q] == 0)                    dfs(a+p,b+q, l);                else if(a + p == o1 && b + q == o2 && l >= 4) {                    sum++;                    if(l > len)                        len = l;                }            }        }    }}int main() {    int n = 0;    while(cin >> w >> h && w + h != 0) {        getchar();        sum = 0;        len = 0;        n++;        for(int i = 0; i < h; i++)            gets(ch[i]);        memset(map, 0, sizeof(map));        memset(flag, 0, sizeof(flag));        change(); // 把h和w也改了        for(int i = 0; i < h; i++)            for(int j = 0; j < w; j++) {                if(flag[i][j] == 0 && map[i][j] == 0) {                    o1 = i;                    o2 = j;                    dfs(i, j, 0);                }            }        printf("Maze #%d:\n", n);        if(sum == 0)            printf("There are no cycles.\n");        else            printf("%d Cycles; the longest has length %d.\n", sum, len);        printf("\n");    }    return 0;}
0 0
原创粉丝点击