第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

請(qǐng)教下關(guān)于羅密歐與朱麗葉迷宮問(wèn)題

請(qǐng)教下關(guān)于羅密歐與朱麗葉迷宮問(wèn)題

實(shí)驗(yàn)名:羅密歐與朱麗葉的迷宮問(wèn)題 實(shí)驗(yàn)內(nèi)容: 問(wèn)題描述: 羅密歐與朱麗葉的迷宮。羅密歐與朱麗葉身處一個(gè)m×n的迷宮中,如圖所示。每一個(gè)方格表示迷宮中的一個(gè)房間。這m×n個(gè)房間中有一些房間是封閉的,不允許任何人進(jìn)入。在迷宮中任何位置均可沿8 個(gè)方向進(jìn)入未封閉的房間。羅密歐位于迷宮的(p,q)方格中,他必須找出一條通向朱麗葉所在的(r,s)方格的路。在抵達(dá)朱麗葉之前,他必須走遍所有未封閉的房間各一次,而且要使到達(dá)朱麗葉的轉(zhuǎn)彎次數(shù)為最少。每改變一次前進(jìn)方向算作轉(zhuǎn)彎一次。請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法幫助羅密歐找出這樣一條道路。 羅密歐與朱麗葉的迷宮 .編程任務(wù): 對(duì)于給定的羅密歐與朱麗葉的迷宮,編程計(jì)算羅密歐通向朱麗葉的所有最少轉(zhuǎn)彎道路。 .數(shù)據(jù)輸入: 由文件input.txt給出輸入數(shù)據(jù)。第一行有3個(gè)正整數(shù)n,m,k,分別表示迷宮的行數(shù),列數(shù)和封閉的房間數(shù)。接下來(lái)的k行中,每行2 個(gè)正整數(shù),表示被封閉的房間所在的行號(hào)和列號(hào)。最后的2 行,每行也有2 個(gè)正整數(shù),分別表示羅密歐所處的方格(p,q)和朱麗葉所處的方格(r,s)。 .結(jié)果輸出: 將計(jì)算出的羅密歐通向朱麗葉的最少轉(zhuǎn)彎次數(shù)和有多少條不同的最少轉(zhuǎn)彎道路輸出到文件output.txt。文件的第一行是最少轉(zhuǎn)彎次數(shù)。文件的第2 行是不同的最少轉(zhuǎn)彎道路數(shù)。接下來(lái)的n行每行m個(gè)數(shù),表示迷宮的一條最少轉(zhuǎn)彎道路。A[i][j]=k表示第k步到達(dá)方格(i,j);A[i][j]=-1 表示方格(i,j)是封閉的。 如果羅密歐無(wú)法通向朱麗葉則輸出“No Solution!”。 輸入文件示例 input.txt 3 4 2 1 2 3 4 1 1 2 2 輸出文件示例 output.txt  6 7 1 -1 9 8 2 10 6 7 3 4 5 -1
查看完整描述

1 回答

?
一只甜甜圈

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊

#include <iostream>
#include <fstream>
using namespace std;
struct RZMaze
{
protected:
static int dir[8][2]; //8個(gè)方向
int n, m, k; //行數(shù)、列數(shù)、封閉房間數(shù)
int Romeo[2]; //Romeo所在的位置
int Juliet[2]; //Juliet所在的位置
int **maze; //迷宮數(shù)組
int **bestx; //保存最優(yōu)解
int bestc; //保存最優(yōu)值
int dirs; //當(dāng)前拐彎次數(shù)
int bccount; //最優(yōu)解的個(gè)數(shù)
public:
RZMaze(int nn, int mm, int kk); //構(gòu)造函數(shù) //給所有的方格標(biāo)記
~RZMaze(); //析構(gòu)函數(shù)
bool InMaze(int x, int y); //判斷坐標(biāo)(x,y)是否還在迷宮內(nèi)
void Backtrack(int dep, int x, int y, int di); //遞歸回溯 走過(guò)多少個(gè)字 已經(jīng)拐了多少?gòu)?br/>void ReadData(fstream &fileIn); //從文件中讀入數(shù)據(jù) 
//先讀封閉房間的行號(hào)和列號(hào)寫(xiě)入r,c
void SaveSol(); //保存當(dāng)前解為最優(yōu)解
void Process(); //處理函數(shù)
void Output(fstream &fileOut); //將計(jì)算結(jié)果輸出到文件中
};
//初始化8個(gè)方向的偏移量
int RZMaze::dir[8][2] = {{-1, 0},{-1,1},{0, 1},{1, 1},

{1, 0}, {1, -1}, {0, -1}, {-1, -1}};
RZMaze::RZMaze(int nn, int mm, int kk)
{
int i, j;
n= nn; m = mm; k = kk;
maze = new int* [n];
for(i = 0; i < n; i++) maze[i] = new int [m];
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++) maze[i][j] = 0;
}
bestx = new int* [n];
for(i = 0; i < n; i++) bestx[i] = new int [m];
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++) bestx[i][j] = 0;
}
}
RZMaze::~RZMaze()
{
int i;
for(i = 0; i < n; i++) delete [] maze[i];
delete maze;
for(i = 0; i < n; i++) delete [] bestx[i];
delete bestx;
}
void RZMaze::SaveSol()
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++) bestx[i][j] = maze[i]

[j];
}
}
bool RZMaze::InMaze(int x, int y)
{
return x >= 0 && x < n && y >= 0 && y< m;
}
//遞歸回溯函數(shù),dep表示已經(jīng)走過(guò)了多少個(gè)方格,(x,y)為當(dāng)前坐標(biāo),di為已經(jīng)拐彎的次數(shù)
void RZMaze::Backtrack(int dep, int x, inty, int di)
{
int i; int p, q; int tmp;
if(dep == m * n - k && x == Juliet[0] && y == Juliet[1])//找到一個(gè)解
{
if(dirs < bestc)
{
bestc = dirs; //更新最優(yōu)值
bccount = 1; //找到第一個(gè)最優(yōu)解
SaveSol(); //更新最優(yōu)解
}
else if(dirs == bestc)
{
bccount++; //最優(yōu)解個(gè)數(shù)加1
}
return;
}
if(dirs > bestc) return; //找不到更好的解 剪枝
else
{
for(i = 0; i < 8; i++) //8個(gè)方向逐一試探
{
p = x + dir[i][0]; q = y + dir[i][1]; //計(jì)算下一個(gè)位置
if(!InMaze(p, q) || maze[p][q] != 0) //不在迷宮內(nèi)或者以前來(lái)過(guò)或者封閉房間
{
continue;
}
tmp = maze[p][q];
maze[p][q] = dep + 1; //下一個(gè)走到的位置
if(dep > 1 && di != i) dirs++; //拐彎(第一次探路不算拐彎)
Backtrack(dep + 1, p, q, i); //遞歸
if(dep > 1 && di != i) dirs--; //撤銷(xiāo)
maze[p][q] = tmp;
}
}
}
void RZMaze::Process()
{
bccount = 0; bestc = n * m; dirs = 0;
maze[Romeo[0]][Romeo[1]] = 1;
Backtrack(1, Romeo[0], Romeo[1], 0);
}
void RZMaze::ReadData(fstream &fileIn)
{
int i; int r, c;
for(i = 0; i < k; i++)
{
fileIn >> r >> c;
maze[r - 1][c - 1] = -1; //把封閉房間標(biāo)記-1
}
fileIn >> r >> c;
Romeo[0] = r - 1; Romeo[1] = c - 1;
fileIn>>r>>c;
Juliet[0] = r - 1; Juliet[1] = c - 1;
}
void RZMaze::Output(fstream &fileOut)
{
int i, j;
if(bccount == 0)
{
cout << "No Solution\n";
fileOut << "No Solution\n";
return;
}
cout << bestc << '\n' << bccount << '\n';
fileOut << bestc << '\n' << bccount << '\n';
for(i = 0; i < n; i++)
{
for(j = 0; j < m; j++)
{
cout << bestx[i][j] << '\t';
fileOut << bestx[i][j] << '\t';
}
cout << '\n';
fileOut << '\n';
}
}
int main()
{
int n, m, k;
fstream fileIn, fileOut;
fileIn.open("in.txt", ios::in);
fileOut.open("out.txt", ios::out);
if(!fileIn)
{
cout<<"文件打開(kāi)錯(cuò)誤!"<<endl;
return 0;
}
fileIn >> n >> m >> k;
RZMaze r(n, m, k);
r.ReadData(fileIn);
r.Process();
r.Output(fileOut);
return 0;
}


查看完整回答
反對(duì) 回復(fù) 2023-04-05
  • 1 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)