第七屆湘電腦程式設計競賽的學生 報道稱,數字遊戲

來源:互聯網
上載者:User

標籤:

報數遊戲時間限制:1000 ms  |  記憶體限制:65535 KB難度:2
描寫敘述
    n 個人站成一行玩一個報數遊戲。全部人從左至右編號為 1 到 n。遊戲開始時,最左邊的人報 1。他右邊的人報 2,編號為 3 的人報 3,等等。當編號為 n 的人(即最右邊的人)報完 n 之後,輪到他左邊的人(即編號為n-1 的人)報 n+1,然後編號為 n-2 的人報 n+2。以此類推。當最左邊的人再次報數之後,報數方向又變成從左至右,依次類推。    為了防止遊戲太無聊,報數時有一個特例:假設應該報的數包括數字 7 或者是 7 的倍數。他應當用拍手取代報數。

下表是 n=4 的報數情況(X 表示拍手)。

當編號為 3 的人第 4 次拍手的時候。他實際上數到了 35。

 人  1  2  3  4  3  2  1  2  3
 報數  1  2  3  4  5  6  X  8  9
 人  4  3  2  1  2  3  4  3  2
 報數  10  11  12  13  X  15  16  X  18
 人  1  2  3  4  3  2  1  2  3
 報數  19  20  X   22  23  24  25  26  X
 人  4  3  2  1  2  3  4  3  2
 報數  X  29 30  31   32  33  34  X  36

    給定 n,m 和 k。你的任務是計算當編號為 m 的人第 k 次拍手時,他實際上數到了幾。
輸入
輸入包括不超過 10 組資料。每組資料佔一行。包括三個整數 n,m 和 k(2<=n<=100, 1<=m<=n, 1<=k<=100)。輸入結束標誌為 n=m=k=0。
輸出
對於每組資料,輸出一行。即編號為 m 的人第 k 次拍手時,他實際上數到的那個整數。
例子輸入
4 3 1 4 3 2 4 3 3 4 3 4 0 0 0 
例子輸出
17 21 27 35 
來源

source=%E6%B9%96%E5%8D%97%E7%9C%81%E7%AC%AC%E4%B8%83%E5%B1%8A%E5%A4%A7%E5%AD%A6%E7%94%9F%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AB%9E%E8%B5%9B" style="text-decoration:none; color:rgb(55,119,188)">湖南省第七屆大學生電腦程式設計競賽


一道簡單的類比題:要類比出現的情況,主要要推出一個規律  在邊界的位置時,下一個報數的位置就是 2*n-2。(我也不知道是怎麼推出來的)

這樣就能夠推算出 每一個編號 下一個報數的位置;直接進行推斷。

#include <cstdio>#include <cstring>bool judge(int n)//推斷函數,推斷是否含7,或者是7的倍數{     if( !(n % 7) ) return true;     while(n)    {        if( n % 10 == 7 )            return true;        n /= 10;    }    return false;}int main(){    int n,m,k,i;    while(scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)    {        int count=0;        for(i=7;;i++)        {            if(judge(i))            {                int x=i%(2*n-2);//得出的是初始編號                if(x==0)                 x=2*n-2;                if(x==m || (x>=n && 2*n-x==m ))//符合題意的情況                    count++;                if(count==k)                    break;            }        }        printf("%d\n",i);    }    return 0;}

還看到別人的還有一種思路,直接找到規律,依據規律暴力求解。

分成了兩個部分進行考慮,邊界情況就直接是2*n-2,中間的間隔是兩個數迴圈變化的。

#include <cstdio>#include <iostream>using namespace std;bool is7( int n )//推斷{    if( !(n % 7) ) return true;    while(n)    {        if( n % 10 == 7 ) return true;        n /= 10;    }    return false;}int main(){    int n, m, k;    while( scanf("%d %d %d", &n, &m, &k) !=EOF && n+m+k )    {        int cnt = 0, period = 2 * n - 2;        if( n == m || m == 1 )//邊界的情況        {            for( int i = m; ; i += period ) if( is7( i ) )                {                    cnt++;                    if( cnt == k )                    {                        printf("%d\n", i);                        break;                    }                }        }        else        {            int next = 2 - m;            for( int i = m; ; swap( next, i ) )//中間的情況            {                next += period;                if( is7( i ) )                {                    cnt++;                    if( cnt == k )                    {                        printf("%d\n", i);                        break;                    }                }            }        }    }    return 0;}

換一種思路。直接進行類比,依照先順序,後倒序進行類比;

#include <cstdio>#include <cstring>bool judge(int n)//推斷{     if( !(n % 7) ) return true;     while(n)    {        if( n % 10 == 7 )            return true;        n /= 10;    }    return false;}int main(){    int n,m,k,i;    while(scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)    {        int pos=0,count=0,flag=0;        for(i=1;i<=n;i++)//順序處理        {            pos++;            if(i==m)            {                if(judge(pos))                    count++;                if(count==k)//搜尋到結果了                {                   printf("%d\n",pos);                   break;                }            }            if(i==n)            {                i=n-1;//進行倒序處理                for(;i>=1;i--)                {                    pos++;                    if(i==m)                    {                        if(judge(pos))                            count++;                        if(count==k)                        {                            flag=1;                            printf("%d\n",pos);                            break;                        }                    }                }             if(flag)  break;             i=1;//回溯到順序           }        }    }    return 0;}


著作權聲明:本文博主原創文章,部落格,未經同意不得轉載。

第七屆湘電腦程式設計競賽的學生 報道稱,數字遊戲

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.