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了解一下
C++版本一
還沒上傳過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; }C++版本二
某位大佬AC的代碼
#include<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; const int maxn=10000; const int INF=0x3f3f3f3f; int vis[maxn+3]; int fq[maxn+3]; struct Node {int ns;int score; }hgf,dzb; queue<Node>q; int bfs() {while (!q.empty()){dzb=q.front();q.pop();if (vis[dzb.score]) continue;if (dzb.score>maxn) continue;vis[dzb.score]=1;for (int i=1;i<=6;i++){if (dzb.ns!=i&&dzb.ns!=(7-i)){hgf.ns=i;hgf.score=dzb.score+i;q.push(hgf);fq[hgf.score]=min(fq[hgf.score],fq[dzb.score]+1);}}}return 0; } int main() {memset(vis,0,sizeof(vis));memset(fq,INF,sizeof(fq));fq[0]=0;int t,s;hgf.ns=1;hgf.score=0;q.push(hgf);bfs();scanf("%d",&t);while (t--){scanf("%d",&s);if (fq[s]==INF) printf("-1\n");else printf("%d\n",fq[s]);}return 0; }?
總結
- 上一篇: qw的表白
- 下一篇: Rabbit寻宝记(2)