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;
}




目录
相关文章
|
21小时前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
10天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
429 191
|
3天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。
|
8天前
|
人工智能 自然语言处理 安全
国内主流Agent工具功能全维度对比:从技术内核到场景落地,一篇读懂所有选择
2024年全球AI Agent市场规模达52.9亿美元,预计2030年将增长至471亿美元,亚太地区增速领先。国内Agent工具呈现“百花齐放”格局,涵盖政务、金融、电商等多场景。本文深入解析实在智能实在Agent等主流产品,在技术架构、任务规划、多模态交互、工具集成等方面进行全维度对比,结合市场反馈与行业趋势,为企业及个人用户提供科学选型指南,助力高效落地AI智能体应用。
|
4天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
313 196