uva 705 - Slash Maze

简介: 点击打开链接 题目意思:给定一个地图,由'\'和'/'组成,要求里面能够构成的环的个数,以及最大的环的步数。 解题思路:对于这类的题目,我们可以利用小化大的思想,我们利用一个比地图大两倍的数组来存储这个地图(四格思想),对于'/',存为1 '\'存为-1,然后我们就可以像在平面上面一样直接dfs,还有对于一个环,它的各个步数肯定都是不能有和边界接触的,那么我们用一个flag来标记是否是环即可求出。

点击打开链接


题目意思:给定一个地图,由'\'和'/'组成,要求里面能够构成的环的个数,以及最大的环的步数。


解题思路:对于这类的题目,我们可以利用小化大的思想,我们利用一个比地图大两倍的数组来存储这个地图(四格思想),对于'/',存为1 '\'存为-1,然后我们就可以像在平面上面一样直接dfs,还有对于一个环,它的各个步数肯定都是不能有和边界接触的,那么我们用一个flag来标记是否是环即可求出。


代码:




#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 200;

int w , h , Max , step , flag , sum;
//Max求出最大的环的步数  step是用来计算每一次搜索的步数  flag判断是否有出界    sum存储最大的环的个数
int num[MAXN][MAXN];//把'\'和'/'转换后的值存储在这个数组
int vis[MAXN][MAXN];//标记是否走过
int dir[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};//方向数组

//深搜
void dfs(int i , int j){
    int k;
    for(k = 0 ; k < 8 ;k++){
        if(i+dir[k][0] < 0 || i+dir[k][0] >= 2*h){
             flag = 0 ; continue;//如果出界就把flag记为0
        }
        if(j+dir[k][1] <0 || j+dir[k][1] >= 2*w){
             flag = 0; continue;//如果出界就把flag记为0
        }
        if(num[i+dir[k][0]][j+dir[k][1]] != 0)//如果有数值则是不能走
             continue;
        if(vis[i+dir[k][0]][j+dir[k][1]] != 0)//如果走过的或者是原点则不能走
             continue;
        if(num[i+dir[k][0]][j+dir[k][1]] == 0 && vis[i+dir[k][0]][j+dir[k][1]] == 0 ){//满足数值为0且没有走过继续搜索  (记住我按顺时针给搜索方向标记了数字0~7)
                if(k == 1){
                    if(num[i-1][j] == 1 && num[i][j+1] == 1){
                        vis[i-1][j+1] = 1;
                        step++;//对应加一个步数
                        dfs(i-1 , j+1);
                    }
                }
                else if(k == 5){
                    if(num[i+1][j]== 1 && num[i][j-1] == 1){
                        vis[i+1][j-1] = 1;
                        step++;;//对应加一个步数
                        dfs(i+1 , j-1);
                    }
                }
                else if(k == 3){
                    if(num[i][j+1] == -1 && num[i+1][j] == -1){
                        vis[i+1][j+1] = 1;
                        step++;;//对应加一个步数
                        dfs(i+1 , j+1);
                    }
                }
                else if(k == 7){
                    if(num[i-1][j] == -1 && num[i][j-1] == -1){
                        vis[i-1][j-1] = 1;
                        step++;;//对应加一个步数
                        dfs(i-1 , j-1);
                    }
                }
                else{
                    vis[i+dir[k][0]][j+dir[k][1]] = 1;
                    step++;;//对应加一个步数
                    dfs(i+dir[k][0] , j+dir[k][1]);
                }
            }
       
    }
}

//处理问题函数
void solve(){
    int i , j;
    memset(vis , 0 , sizeof(vis));//初始化
    Max = 0;sum = 0;
    for(i = 0 ; i < 2*h ; i++){
       for(j = 0 ; j < 2*w ; j++){
           if(num[i][j] == 0 && vis[i][j] == 0){
               step = 1;flag = 1;//初始化为1
               vis[i][j] = -1;//先标价为-1
               dfs(i , j);//搜索
               vis[i][j] = 1;//在从新标记为1
               if(flag){//如果是环则sum加加,判断最大的Max
                   sum++;
                  if(Max < step)
                     Max = step;
               }
           }
       }   
    }
}

//主函数
int main(){
    int i , j , t = 1;
    char ch;
    while(scanf("%d%d%*c" , &w , &h) &&w &&h){  //读入判断
        memset(num , 0 , sizeof(num));
        for(i = 0 ; i < h ;i++){
            for(j = 0 ; j < w ; j++){
                scanf("%c" , &ch);
                if(ch == '\\'){//如果是‘\’化为-1
                   num[2*i][j*2] = -1;
                   num[2*i+1][j*2+1] = -1;
                }
                if(ch == '/'){//如果是'/'化为1
                   num[2*i+1][2*j] = 1;
                   num[2*i][2*j+1] = 1;        
                }
            }
            getchar();
        }
        solve();
        printf("Maze #%d:\n" ,t);
        if(sum).
            printf("%d Cycles; the longest has length %d.\n\n" ,sum ,Max);
        else
            printf("There are no cycles.\n\n");
        t++;
    }
    return 0;
}




目录
相关文章
UVa11679 - Sub-prime
UVa11679 - Sub-prime
54 0
CodeForces 377A-Maze(DFS找连通块)
CodeForces 377A-Maze(DFS找连通块)
CodeForces 377A-Maze(DFS找连通块)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
洛谷P1825-[USACO11OPEN]Corn Maze S(BFS)
[HDU 4738] Caocao‘s Bridges | Tarjan 求割边
Problem Description Caocao was defeated by Zhuge Liang and Zhou Yu in the battle of Chibi. But he wouldn’t give up. Caocao’s army still was not good at water battles, so he came up with another idea. He built many islands in the Changjiang river,
141 0
|
算法 JavaScript
【UVA 10307 Killing Aliens in Borg Maze】最小生成树, kruscal, bfs
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20846 POJ 3026是同样的题,但是内存要求比较严格,并是没有过。
1356 0
[LeetCode] Dungeon Game
An interesting problem. The code is also short and clear. The basic idea is to use a 2d array dp[i][j] to denote the minimum hp that is required before entering dungeon[i][j].
738 0
|
人工智能 BI 算法
|
定位技术
codeforces 377A Maze
点击打开cf377A 题意:给定一个n*m的地图,这个地图初始化有s个空地,并且这s个空地是连通的。现在要求找到一种方案放k个的墙到这个地图使得剩下的s-k个点还是连通的 思路:因为初始化的地图是一个连通的,要求s-k个点也是连通的。
1022 0
zoj 2158 prim
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1158 #include &lt;cstdio&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; #define INF 1000000 #define MAXN 2000 int N; char c
971 0