http://noi.openjudge.cn/_2.5基本算法之搜索_1804:小游戲

文章目錄

    • 題目
    • 深搜代碼
    • 寬搜代碼
    • 深搜數據
    • 演示圖
    • 總結

題目

1804:小游戲
總時間限制: 1000ms 內存限制: 65536kB
描述
一天早上,你起床的時候想:“我編程序這么牛,為什么不能靠這個賺點小錢呢?”因此你決定編寫一個小游戲。 游戲在一個分割成w * h個正方格子的矩形板上進行。如圖所示,每個正方格子上可以有一張游戲卡片,當然也可以沒有。 當下面的情況滿足時,我們認為兩個游戲卡片之間有一條路徑相連: 路徑只包含水平或者豎直的直線段。路徑不能穿過別的游戲卡片。但是允許路徑臨時的離開矩形板。下面是一個例子:
在這里插入圖片描述
這里在 (1, 3)和 (4, 4)處的游戲卡片是可以相連的。而在 (2, 3) 和 (3, 4) 處的游戲卡是不相連的,因為連接他們的每條路徑都必須要穿過別的游戲卡片。 你現在要在小游戲里面判斷是否存在一條滿足題意的路徑能連接給定的兩個游戲卡片。
輸入
輸入包括多組數據(不多于10組)。一個矩形板對應一組數據。每組數據包括的第一行包括兩個整數w和h (1 <= w, h <= 75),分別表示矩形板的寬度和長度。下面的h行,每行包括w個字符,表示矩形板上的游戲卡片分布情況。使用‘X’表示這個地方有一個游戲卡片;使用空格表示這個地方沒有游戲卡片。
之后的若干行上每行上包括4個整數x1, y1, x2, y2 (1 <= x1, x2 <= w, 1 <= y1, y2 <= h)。給出兩個卡片在矩形板上的位置(注意:矩形板左上角的坐標是(1, 1))。輸入保證這兩個游戲卡片所處的位置是不相同的。如果一行上有4個0,表示這組測試數據的結束。
如果一行上給出w = h = 0,那么表示所有的輸入結束了。
輸出
對每一個矩形板,輸出一行“Board #n:”,這里n是輸入數據的編號。然后對每一組需要測試的游戲卡片輸出一行。這一行的開頭是“Pair m: ”,這里m是測試卡片的編號(對每個矩形板,編號都從1開始)。接下來,如果可以相連,找到連接這兩個卡片的所有路徑中包括線段數最少的路徑,輸出“k segments.”,這里k是找到的最優路徑中包括的線段的數目;如果不能相連,輸出“impossible.”。
每組數據之后輸出一個空行。
樣例輸入
5 4
XXXXX
X X
XXX X
XXX
2 3 5 3
1 3 4 4
2 3 3 4
0 0 0 0
0 0
樣例輸出
Board #1:
Pair 1: 4 segments.
Pair 2: 3 segments.
Pair 3: impossible.

深搜代碼

#include <bits/stdc++.h>
using namespace std;
struct point{int x,y,//出發行列 d,//方向 num;//線段數 
};
bool k[100][100];//標記是不是牌, 
int r,c,//地圖行列 sx,sy,tx,ty, //始發和終點位置 d[4][2]={{0,-1},{-1,0},{0,1},{1,0}},//左上右下四個方向的行列變化 num[100][100];//每個點四個方向的最少線段數,要逐個逐方向更新更小值。
void view(bool k[][100]){cout<<"地圖\n";cout<<" 列\t";for(int j=0;j<=c+1;j++)cout<<j<<"";cout<<endl;for(int i=0;i<=r+1;i++){cout<<i<<"行\t";for(int j=0;j<=c+1;j++)cout<<(k[i][j]?'X':' ')<<"";cout<<endl;}	
}
void view(int k[][100],int ans){cout<<"最少線段數"<<ans<<endl;cout<<" 列\t";for(int j=0;j<=c+1;j++)cout<<j<<"";cout<<endl;for(int i=0;i<=r+1;i++){cout<<i<<"行\t";for(int j=0;j<=c+1;j++)cout<<num[i][j]<<"";cout<<endl;}cout<<endl; 
}
void go(int x,int y,int f,int numx,int& ans){int x2,y2;for(int i=0;i<4;i++){x2=x+d[i][0],y2=y+d[i][1];if(x2<0||x2>r+1||y2<0||y2>c+1)continue;//不能越界 int cost=(i==f?numx:numx+1);if(cost>=ans)continue;//剪枝,超過最少線段數的線路不用考慮 if(x2==tx&&y2==ty){ans=min(ans,cost);//cout<<"OK"<<endl;view(num,ans);return;}if(k[x2][y2]||num[x2][y2])continue;//如果是牌不能穿越 num[x2][y2]=cost;//標記,并記住步數go(x2,y2,i,cost,ans); num[x2][y2]=0;//回溯 }
}
int main(){//freopen("data.cpp","r",stdin);int t1=1;while(cin>>c>>r&&(r||c)){//多組地圖,全部是0才結束 cin.get();//消融行結束標記 memset(k,0,sizeof(k));//初始化整個地圖,0是可以走 char cx;//地圖字符 for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cx=cin.get();k[i][j]=(cx=='X'?1:0);//卡片不能走 }cin.get();//消融行結束標記}cout<<"Board #"<<t1++<<":\n";//輸出組信息int t2=1,x,y,//出發行列 x2,y2;//到達行列 while(cin>>sy>>sx>>ty>>tx&&(sx||sy||tx||ty)){//多組數據,全部是0才結束 //cout<<"出發:"<<sx<<","<<sy<<"\t"<<tx<<","<<ty<<endl;memset(num,0,sizeof(num));//各點初始化為最大值 int ans=0x3f3f3f;//0x3f=63,不夠大,0x3f3f3f=4194303夠了//view(k);go(sx,sy,-1,0,ans);cout<<"Pair "<<t2++<<": ";if(ans==0x3f3f3f)cout<<"impossible.\n";else cout<<ans<<" segments.\n"; }cout<<endl;//每組地圖后有空行 } return 0;
}

寬搜代碼

#include <bits/stdc++.h>
using namespace std;
struct point{int x,y,//出發行列 d,//方向 num;//線段數 
};
bool k[100][100];//標記是不是牌, 
int r,c,//地圖行列 sx,sy,tx,ty, //始發和終點位置 d[4][2]={{0,-1},{-1,0},{0,1},{1,0}},//左上右下四個方向的行列變化 num[100][100][4];//每個點四個方向的最少線段數,要逐個逐方向更新更小值。
int main(){//freopen("data2.cpp","r",stdin);int t1=1;while(cin>>c>>r&&(r||c)){//多組地圖,全部是0才結束 cin.get();//消融行結束標記 memset(k,0,sizeof(k));//初始化整個地圖,0是可以走 char cx;//地圖字符 for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){cx=cin.get();if(cx=='X')k[i][j]=1;//k[i][j]=(cx=='X'?1:0);//卡片不能走 }cin.get();//消融行結束標記}cout<<"Board #"<<t1++<<":\n";//輸出組信息int t2=1,x,y,//出發行列 x2,y2;//到達行列 while(cin>>sy>>sx>>ty>>tx&&(sx||sy||tx||ty)){//多組數據,全部是0才結束 memset(num,0x3f3f3f,sizeof(num));//各點初始化為最大值 queue<point> q;//寬搜隊列 q.push(point{sx,sy,-1,0});//出發,下次方向都算不同,就會0+1多個線路for(int i=0;i<4;i++)num[sx][sy][i]=0;//出發位置各方向無線段 int ans=0x3f3f3f,//找最少線段數 cost;//中間值,存線段數變化結果 while(!q.empty()){point p=q.front();q.pop();x=p.x,y=p.y;for(int i=0;i<4;i++){//四個方向逐個嘗試 x2=x+d[i][0],y2=y+d[i][1];if(x2<0||x2>r+1||y2<0||y2>c+1)continue;//出界 cost=(p.d==i?p.num:p.num+1);//方向一樣線段數不變,否則多條線段 if(x2==tx&&y2==ty){//到達目標 if(num[x2][y2][i]>cost)num[x2][y2][i]=cost;ans=min(ans,cost);//更新最終最少線段數 }if(k[x2][y2])continue;//不能穿越牌if(num[x2][y2][i]>cost){//更少的線段數才更新并出發。 num[x2][y2][i]=cost;//更新該點i方向上的最少線段數 q.push(point{x2,y2,i,cost});//從新達點出發 }}}cout<<"Pair "<<t2++<<": ";if(ans==0x3f3f3f)cout<<"impossible.\n";else cout<<ans<<" segments.\n"; }cout<<endl;//每組地圖后有空行 } return 0;
}

深搜數據

地圖列     01234567
01行       XXXX
2行         XX
3行      XX  X
4行      XXX  X
5行
Board #1:
出發:3,1       4,6
地圖列     01234567
01行       XXXX
2行         XX
3行      XX  X
4行      XXX  X
5行
OK
最少線段數1001234567
023333333
120000054
220000067
310000098
400000000
500000000OK
最少線段數901234567
023333333
120000054
220000067
310000008
400000008
500000000OK
最少線段數601234567
023333333
120000054
220000060
310000060
400000000
500000000OK
最少線段數501234567
023333333
120000004
220000004
310000004
400000004
500000000OK
最少線段數401234567
023333330
120000040
220000040
310000040
400000000
500000000OK
最少線段數301234567
001222220
101000030
201000030
300000030
400000000
500000000Pair 1: 3 segments.

演示圖

在這里插入圖片描述

總結

1.問的不是步數,而是線段數
2.出發到到達方向一樣,是一條線段,
不一樣是兩條線段
所以出發位置得帶方向
3.寬搜,從不同方向到達該點,用更少線段數更新。不少不更新
例:短距離多線段,上2右1下1右1下1左2可達目標,是6線段
長距離少線段,上2右2下2左2,是4線段
4.數組得初始化。
如果用字符數組表示地圖,外延得初始化,否則有可能是’X’,不能通過。
5.從大開始找最小,
初始化整型數組(各點最少線段數num[100][100][4]),可以用 memset(num,0X3f3f3f,sizeof(num))
十六進制0X3f=整數63,不夠大.
十六進制0X3f3f3f=整數4194303.
再大就得逐一賦值。
6.深搜就是嘗試所有的情況,關鍵就是剪

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

發生梯度消失, 梯度爆炸問題的原因,怎么解決?

目錄 一、梯度消失的原因 二、梯度爆炸的原因 三、共同的結構性原因 四、解決辦法 五、補充知識 一、梯度消失的原因 梯度消失指的是在反向傳播過程中&#xff0c;梯度隨著層數的增加指數級減小&#xff08;趨近于0&#xff09;&#xff0c;導致淺層網絡的權重幾乎無法更新…

【USRP】srsRAN 開源 4G 軟件無線電套件

srsRAN 是SRS開發的開源 4G 軟件無線電套件。 srsRAN套件包括&#xff1a; srsUE - 具有原型 5G 功能的全棧 SDR 4G UE 應用程序srsENB - 全棧 SDR 4G eNodeB 應用程序srsEPC——具有 MME、HSS 和 S/P-GW 的輕量級 4G 核心網絡實現 安裝系統 Ubuntu 20.04 USRP B210 sudo …

ChatGPT 4:解鎖AI文案、繪畫與視頻創作新紀元

文章目錄 一、ChatGPT 4的技術革新二、AI文案創作&#xff1a;精準生成與個性化定制三、AI繪畫藝術&#xff1a;從文字到圖像的神奇轉化四、AI視頻制作&#xff1a;自動化剪輯與創意實現五、知識庫與ChatGPT 4的深度融合六、全新的變革和機遇《ChatGPT 4 應用詳解&#xff1a;A…

在js中數組相關用法講解

數組 uniqueArray 簡單數組去重 /*** 簡單數組去重* param arr* returns*/ export const uniqueArray <T>(arr: T[]) > [...new Set(arr)];const arr1 [1,1,1,1 2, 3];uniqueArray(arr); // [1,2,3]uniqueArrayByKey 根據 key 數組去重 /*** 根據key數組去重* …

RT-Thread ulog 日志組件深度分析

一、ulog 組件核心功能解析 輕量化與實時性 ? 資源占用&#xff1a;ulog 核心代碼僅需 ROM<1KB&#xff0c;RAM<0.2KB&#xff0c;支持在資源受限的MCU&#xff08;如STM32F103&#xff09;中運行。 ? 異步/同步模式&#xff1a;默認采用異步環形緩沖區&#xff08;rt_…

T113s3遠程部署Qt應用(dropbear)

T113-S3 是一款先進的應用處理器&#xff0c;專為汽車和工業控制市場而設計。 它集成了雙核CortexTM-A7 CPU和單核HiFi4 DSP&#xff0c;提供高效的計算能力。 T113-S3 支持 H.265、H.264、MPEG-1/2/4、JPEG、VC1 等全格式解碼。 獨立的硬件編碼器可以編碼為 JPEG 或 MJPEG。 集…

12.青龍面板自動化我的生活

安裝 docker方式 docker run -dit \ -v /root/ql:/ql/data \ -p 5700:5700 \ -e ENABLE_HANGUPtrue \ -e ENABLE_WEB_PANELtrue \ --name qinglong \ --hostname qinglong \ --restart always \ whyour/qinglongk8s方式 https://truecharts.org/charts/stable/qinglong/ he…

Maven 遠程倉庫推送方法

步驟 1&#xff1a;配置 pom.xml 中的遠程倉庫地址 在項目的 pom.xml 文件中添加 distributionManagement 配置&#xff0c;指定遠程倉庫的 URL。 xml 復制 <project>...<distributionManagement><!-- 快照版本倉庫 --><snapshotRepository><id…

Spring Boot 日志 配置 SLF4J 和 Logback

文章目錄 一、前言二、案例一&#xff1a;初識日志三、案例二&#xff1a;使用Lombok輸出日志四、案例三&#xff1a;配置Logback 一、前言 在開發 Java 應用時&#xff0c;日志記錄是不可或缺的一部分。日志可以記錄應用的運行狀態、錯誤信息和調試信息&#xff0c;幫助開發者…

JS API 事件監聽

焦點事件案例&#xff1a;搜索框激活下拉菜單 事件對象 事件對象存儲事件觸發時的相關信息 可以判斷用戶按鍵&#xff0c;點擊元素等內容 如何獲取 事件綁定的回調函數中的第一個形參就是事件對象 一般命名為e,event 事件對象常用屬性 type類型 click mouseenter client…

DDD與MVC擴展能力對比

一、架構設計理念的差異二、擴展性差異的具體表現三、DDD擴展性優勢的深層原因四、MVC擴展性不足的典型場景五、總結&#xff1a;架構的本質與選擇六、例子1&#xff09;場景描述2&#xff09;MVC實現示例&#xff08;三層架構&#xff09;3&#xff09;DDD實現示例&#xff08…

針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結

以下是針對 SQL 查詢中 IN 子句性能優化 以及 等值 JOIN 和不等值 JOIN 對比 的詳細解決方案、代碼示例及表格總結&#xff1a; 問題 1&#xff1a;IN 的候選值過多&#xff08;如超過 1000 個&#xff09; 問題描述 當 IN 列表中的值過多時&#xff0c;SQL 會逐個比較每個值…

手部穴位檢測技術:基于OpenCV和MediaPipe的實現

手部穴位檢測是醫學和健康管理領域的重要技術之一。通過準確識別手部的關鍵穴位,可以為中醫診斷、康復治療以及健康監測提供支持。本文將介紹一種基于OpenCV和MediaPipe的手部穴位檢測方法,展示如何利用計算機視覺技術實現手部關鍵點的檢測,并進一步標注手部的穴位位置。 技…

Day20 -自動化信息收集工具--ARL燈塔的部署

準備&#xff1a; 純凈的Docker環境 ARL的包 一、Docker的部署 00x1 更新系統包 sudo apt update 00x2 安裝必要的依賴包 sudo apt install -y apt-transport-https ca-certificates curl software-properties-common 00x3 下載docker和docker-compose apt-get install do…

sqlalchemy查詢json

第一種&#xff1a;字段op是json格式&#xff1a; {"uid": "cxb123456789","role": 2,"op_start_time": 1743513707504,"op_end_time": 1743513707504,"op_start_id": "op_001","op_end_id"…

搭建K8S-1.23

0、簡介 這里只用3臺服務器來做一個簡單的集群 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 1、關閉三個服務 &#xff08;1&#xff09;防火墻 systemctl stop firewalld &#xff08;2&#xff09;Selinux setenf…

初階數據結構--樹

1. 樹的概念與結構 樹是?種?線性的數據結構&#xff0c;它是由 n&#xff08;n>0&#xff09; 個有限結點組成?個具有層次關系的集合。把它叫做 樹是因為它看起來像?棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;?葉朝下的。 有?個特殊的結點&#xff0c;稱…

硬件工程師面試問題(五):藍牙面試問題與詳解

藍牙技術作為物聯網與智能設備的核心無線協議&#xff0c;其硬件設計能力直接影響產品連接穩定性、功耗及兼容性。面試是評估候選人射頻電路設計、天線優化、協議棧調試等綜合技能的關鍵環節&#xff0c;尤其在BLE低功耗設計、共存抗干擾等場景中&#xff0c;硬件工程師的實踐經…

Redis-基本數據類型

Redis支持的基本數據類型&#xff1a;String、hash、list、Set、Zset 一、String 特點 可以存儲三種類型 int、float、string 運用場景 緩存&#xff1a;存儲HTML片段、用戶會話&#xff08;Session&#xff09;計數器&#xff1a;網站訪問量、點贊數&#xff08;incr方法&am…

Tomcat的部署

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和 并發訪問用戶不是很多的場合下被普遍使用&#xff0c;Tomcat 具有處理HTML頁面的功能&#xff0c;它還是一個Servlet和 JSP容器 官網:Apache Tomcat - Welco…