码迷,mamicode.com
首页 > 其他好文 > 详细

题目1457:非常可乐(广度优先遍历BFS)

时间:2017-04-23 01:03:16      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:遍历   namespace   efi   int   ring   color   use   bsp   result   

题目链接:http://ac.jobdu.com/problem.php?pid=1457

详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus

参考代码:

//
//  1457 非常可乐.cpp
//  Jobdu
//
//  Created by PengFei_Zheng on 22/04/2017.
//  Copyright © 2017 PengFei_Zheng. All rights reserved.
//
 
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <queue>
#define MAX_SIZE 101
using namespace std;
 
int s, n, m;
 
struct N{
    int a;
    int b;
    int c;
    int t;
};
 
queue<N> myQueue;
bool visit[MAX_SIZE][MAX_SIZE][MAX_SIZE];
 
void x2y(int &x,int size_x, int &y,int size_y){
    if(size_y - y >= x){
        y+=x;
        x = 0;
    }else{
        x -=(size_y-y);
        y = size_y;
    }
}
 
int BFS(int s, int n, int m){
    while(!myQueue.empty()){
        N nowP = myQueue.front();
        myQueue.pop();
        int a, b, c;
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(a,s,b,n);// a--->b
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(a,s,c,m);// a--->c
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(b,n,a,s);// b--->a
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(b,n,c,m);// b--->c
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(c,m,a,s);// c--->a
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
        a = nowP.a;
        b = nowP.b;
        c = nowP.c;
        x2y(c,m,b,n);// c--->b
        if(visit[a][b][c]==false){
            visit[a][b][c]=true;
            N tmp;
            tmp.a = a;
            tmp.b = b;
            tmp.c = c;
            tmp.t = nowP.t+1;
            if((a==s/2 && b==s/2) || (a==s/2 &&c==s/2) || (b==s/2 && c==s/2) ) return tmp.t;
            myQueue.push(tmp);
        }
    }
    return -1;
}
 
int main(){
    while(scanf("%d%d%d",&s,&n,&m)!=EOF){
        if(s==0) break;
        if(s%2==1){
            printf("NO\n");
            continue;
        }
        for(int i = 0 ; i <= s ; i++){
            for(int j = 0 ; j <= n ; j++){
                for(int k = 0 ; k <= m ; k++){
                    visit[i][j][k]=false;
                }
            }
        }
        while(!myQueue.empty()) myQueue.pop();
         
        N tmp;
        tmp.a = s;
        tmp.b = tmp.c = tmp.t = 0;
        myQueue.push(tmp);
        visit[s][0][0]=true;
        int ans = BFS(s,n,m);
        ans == -1 ? printf("NO\n") : printf("%d\n",ans);
    }
}
/**************************************************************
    Problem: 1457
    User: zpfbuaa
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:2528 kb
****************************************************************/

 

题目1457:非常可乐(广度优先遍历BFS)

标签:遍历   namespace   efi   int   ring   color   use   bsp   result   

原文地址:http://www.cnblogs.com/zpfbuaa/p/6750319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!