1. 程式人生 > >9.29-分支限界法

9.29-分支限界法

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