本文主要是介绍poj_1184_BFS(?可以不用吧,待改…,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
给一个初始序列,光标停在序列第一个位置。有6个键盘操作分别做左右移动,交换首末和加减操作,求如何用最短的操作组合数来令初始序列达到某个序列。
题目思路:
BFS。
待改——代码有点不伦不类。
代码:
#include <stdio.h>
#include <stdio.h>
#include <math.h>
//#include <time.h>
//#include <windows.h>
#define N 100000
#define MAX 1000000
typedef struct{
int array[8];
int c;
int pos[6];
}QUEUE;
char flag[MAX][6][10];
int src_array[8], des_array[7], min_cnt, src, des;
QUEUE q[N];
int top, num;
int array_to_int(int a[7])
{
int sum = 0, i;
for(i=0;i<6;i++)
sum = sum*10 + a[i];
return sum;
}
void find_solution()
{
QUEUE tq;
int tmp,j,pos,value,f2=0;
while(top<=num){ //取队列top,加入后续队列
if(q[top].c > min_cnt){
top ++;
continue;
}
tq = q[top]; //判断是否更新min_cnt
if(array_to_int(tq.array) == des){
if(tq.c < min_cnt)
min_cnt = tq.c;
}
else{
j = 0;
while(j<6){
f2 = 0;
if(tq.pos[j]){ //光标到达过的位置
tq.c += abs(tq.array[j] - des_array[j]);
if(tq.c > min_cnt)
break;
f2 = 1;
}
else{
if(tq.pos[j]!=des_array[j])
break;
f2 = 1;
}
j++;
}