9.29-分支限界法
阿新 • • 發佈:2018-12-12
1.加1乘2平方
描述:最簡單的佇列的使用 #include <iostream> #include <queue> using namespace std; queue<int> q1; int main() { int temp, x; q1.push(5);//入隊 q1.push(8);//入隊 temp = q1.front();//訪問隊首元素 q1.pop();//出隊 q1.empty();//判佇列是否為空 q1.back();//返回隊尾元素 q1.size();//返回佇列長度 } 給定兩個正整數m、n,問只能做加1、乘2和平方這三種變化,從m變化到n最少需要幾次
輸入:輸入兩個10000以內的正整數m和n,且m小於n
輸出:輸出從m變化到n的最少次數
輸入樣例
1 16
輸出樣例
3
#include<iostream> #include<queue> using namespace std; void dfs(int k); int doit(int u, int i); queue<int> q; bool used[10005]; int n, m; int step[10005]; int main(){ cin >> n >> m; for(int i = n+1; i <= m; i++){ used[i] = true; } step[n] = 0; used[n] = false; q.push(n); dfs(n); } void dfs(int k){ int u, v; int flag; while(!q.empty()){ flag = 0; u = q.front(); q.pop(); for(int i = 0; i < 3; i++){ v = doit(u, i); if(v == m){ cout << step[u] +1 << endl; flag = 1; break; } else if(v < m && used[v]){ q.push(v); used[v] = false; step[v] = step[u] + 1; } } if(flag){ break; } } } int doit(int u, int i){ if(i == 0){ return(u+1); } else if(i == 1){ return(2*u); } else{ return(u*u); } }
2.電子老鼠闖迷宮
描述:有一隻電子老鼠被困在如下圖所示的迷宮中。這是一個12*12單元的正方形迷宮,黑色部分表示建築物,白色部分是路。電子老鼠可以在路上向上、下、左、右行走,每一步走一個格子。現給定一個起點S和一個終點T,求出電子老鼠最少要幾步從起點走到終點。
輸入:本題包含一個測例。在測例的第一行有四個由空格分隔的整數,分別表示起點的座標S(x.y)和終點的座標T(x,y)。從第二行開始的12行中,每行有12個字元,描述迷宮的情況,其中'X'表示建築物,'.'表示路.
輸出:輸出一個整數,即電子老鼠走出迷宮至少需要的步數。
輸入樣例
2 9 11 8 XXXXXXXXXXXX X......X.XXX X.X.XX.....X X.X.XX.XXX.X X.X.....X..X X.XXXXXXXXXX X...X.X....X X.XXX...XXXX X.....X....X XXX.XXXX.X.X XXXXXXX..XXX XXXXXXXXXXXX
輸出樣例
28
#include<iostream>
#include<queue>
using namespace std;
void init();
void dfs();
int cando(int xu, int yu, int i);
struct address{
queue<int> row;
queue<int> col;
}address;
char map[12][12];
bool used[12][12];
int xf, yf, xt, yt;
int step[12][12];
int x[4] = {0, 1, 0, -1};
int y[4] = {-1, 0, 1, 0};
int main(){
init();
dfs();
}
void init(){
int i, j;
cin >> xf >> yf >> xt >> yt;
for(i = 0; i < 12; i++){
for(j = 0; j < 12; j++){
cin >> map[i][j];
if(map[i][j] == 'X'){
used[i][j] = false;
}
else{
used[i][j] = true;
}
}
used[xf-1][yf-1] = false;
step[xf-1][yf-1] = 0;
address.row.push(xf-1);
address.col.push(yf-1);
}
}
void dfs(){
int xu, yu, xv, yv;
while(!address.row.empty()){
xu = address.row.front();
yu = address.col.front();
address.row.pop();
address.col.pop();
if(xu == xt-1 && yu == yt-1){
cout << step[xu][yu] << endl;
}
else{
for(int i = 0; i < 4; i++){
if(cando(xu, yu, i)){
xv = xu + x[i];
yv = yu + y[i];
address.row.push(xv);
address.col.push(yv);
used[xv][yv] = false;
step[xv][yv] = step[xu][yu] +1;
}
}
}
}
}
int cando(int xu, int yu, int i){
int xv, yv;
xv = xu + x[i];
yv = yu + y[i];
if(xv < 0 || xv >=12 || yv < 0 || yv >=12 ||!used[xv][yv]){
return 0;
}
else{
return 1;
}
}