1. 程式人生 > >Jeff與骰子游戲

Jeff與骰子游戲

Description

骰子大家一定都玩過。 一個骰子有六個面,每個面都有一個數字。對於骰子的每一個面,你都可以通過朝一個方向翻轉90度來獲得另一個面。

現在你有一個骰子,一開始朝上的一面點數為1(如圖上的第一個骰子所示)。 你每次都可以將它朝一個方向翻轉90度,並獲得相當於翻轉之後的骰子朝上一面的點數的分數。比如,現在骰子朝上的一面點數為1,你可以通過翻轉使它朝上的一面變成3,並獲得3分。 現在給出一個目標分數s,請問你至少需要翻轉幾次,使得你的分數剛好等於目標分數。

Input

題目包含多組測試資料。 第一行是一個整數T,表示有T組測試資料。 對於每組測試資料,只有一個正整數s,表示你需要達到的目標分數。(1 <= s <= 10000)

Output

對於每組測試資料,輸出達到目標分數至少需要翻轉幾次,如果無解請輸出-1。

Sample Input

2 5 10

Sample Output

1 2

Hint

對於第二組樣例: 你可以先翻轉90度,使得骰子朝上的一面變為4,並獲得4分。 之後你可以再翻轉90度,使得骰子朝上的一面變為6,並獲得6分。 所以你至少需要2步來達到目標分數。

題解:

BFD瞭解一下

還沒上傳過emmm大概這個思路

#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
int ta,n,m;
int vis[100000];
struct node{
 int u;
 int a;
 int c;
}s,t,f;
queue<node>q;
int bfs(){
    while(!q.empty())
        q.pop();
    s.u=1;
    s.a=1;
    s.c=0;
    q.push(s);
    vis[1]=1;
    while(!q.empty()){
        f=q.front();
        q.pop();
        if(f.a==n)
            return f.c;
        if(f.a>n)
            continue;
        for(int i=1;i<=6;i++ ){
            if(i==t.u||i==7-t.u)
                continue;
            t=f;
            t.a+=i;
            if(!vis[t.a]){
                t.u=i;
                t.c++;
                vis[t.a]=1;
                q.push(t);
            }
        }
    }
    return -1;
}
int main()
{
    scanf("%d",&ta);
    while(ta--){
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        printf("%d\n",bfs());
    }
    return 0;
}