10l7l3l倒水的for循环和queue的使用(待续
1.讲解广度优先搜索以及普及优先级概念
一个最基础的
https://www.cnblogs.com/tlysMoodspace/p/11832181.html
核心代码:
b[0][0]=10; b[1][0]=7; b[2][0]=3;
b[0][1]=10; b[1][1]=0; b[2][1]=0;
//三杯子,初始只有10L的杯子是满的
// b[0][1]=1; b[1][1]=0; b[2][1]=0;
if(b[0][i]!=0){
//如果10L的杯子有酒
if(b[1][i]<7){
//如果7L的杯子没满
if(b[0][i]+b[1][i]<7){
//如果10L和7L杯子加起来不能补满7L的杯子
b[0][tail]=0;
b[1][tail]=b[1][i]+b[0][i];
//全倒入7L杯子
b[2][tail]=b[2][i];
windows下Dev解10l7l3l倒水,for循环版本
#include <stdio.h> #include <stdlib.h> #include <time.h> struct t{ int z[3]; int num; int n[100]; }b[10050]; int stime=1; //数字越大.休眠时间越久 int m=0,i,j=0,k; int time1=107,time2=103,time3=710,time4=73,time5=37,time6=310; int head=1,tail=2,btime=0,bord; void zzzz(){ b[tail].n[b[i].n[0]]=tail; for(k=0;k<b[i].n[0];k++) b[tail].n[k]=b[i].n[k]; b[tail].n[0]++; printf("\n\t%d\t%d\t%d\n",b[i].z[0],b[i].z[1],b[i].z[2]); printf("%d\t%d\t%d\t%d\n",btime, b[tail].z[0],b[tail].z[1],b[tail].z[2]); _sleep(stime*1000); //休眠时间单位ms tail++; } int a[6][3]={ 0,1,2, 0,2,1, 1,0,2, 1,2,0, 2,0,1, 2,1,0 }; int main() { b[0].z[0]=10; b[0].z[1]=7; b[0].z[2]=3; b[1].z[0]=10; b[1].z[1]=0; b[1].z[2]=0; b[1].n[0]=2; b[1].n[1]=1; //三杯子,初始只有10L的杯子是满的 // b[0][1]=1; b[1][1]=0; b[2][1]=0; //三杯子,初始10L的杯子是满的 for(i=0;i<6;i++) { for(j=0;j<3;j++) { printf("%d ",a[i][j]); } printf("\n"); } m=0; while(head<tail){ if(m==1) break; btime++; bord=tail; for(i=head;i<bord;i++){ if(m==1) break; printf("\n%d\t%d\t%d\t%d\n",btime,b[i].z[0],b[i].z[1],b[i].z[2]); for(j=0;j<6;j++){ if(b[i].z[0]==5||b[i].z[1]==5||b[i].z[2]==5){ m=1;break; } //找到55平分则退出 if(b[i].z[a[j][0]]!=0){ //如果第a[j][0]的杯子有水 if(b[i].z[a[j][1]]<b[0].z[a[j][1]]){ if(b[i].z[a[j][0]]+b[i].z[a[j][1]]<b[0].z[a[j][1]]){ b[tail].z[a[j][0]]=0; b[tail].z[a[j][1]]=b[i].z[a[j][0]]+b[i].z[a[j][1]]; b[tail].z[a[j][2]]=b[i].z[a[j][2]];
} else{ b[tail].z[a[j][0]]=b[i].z[a[j][0]]+b[i].z[a[j][1]]-b[0].z[a[j][1]]; b[tail].z[a[j][1]]=b[0].z[a[j][1]]; b[tail].z[a[j][2]]=b[i].z[a[j][2]]; } zzzz(); if(b[tail-1].z[a[j][0]]==5||b[tail-1].z[a[j][1]]==5||b[tail-1].z[a[j][2]]==5){ m=1; break; } } } } } head=bord; } if(m==1){ printf("找到了!\n"); for(k=1;k<b[tail-1].n[0];k++){ for(j=0;j<3;j++) printf("%d\t",b[b[tail-1].n[k]].z[j]); printf("\n"); } } }
queue改造:
using namespace std; //懒
struct Point
{
int x[3];
};
queue <Point> searchlist;
void solvea()
{
Point a;
//初始化
for(int i=0;i<3;i++)
a.x[i] = 0;
searchlist.push(a);
while(!searchlist.empty()){
Point b = searchlist.front(); //取队列顶
for(int i=0;i<3;i++)
cout << temp.x[i] << " ";
cout << endl ;
searchlist.pop(); //弹
}
}