Jeff與骰子游戲
阿新 • • 發佈:2018-12-20
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; }