zzulioj 小火山專題

1908: 小火山的圍棋夢想

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 307  Solved: 80

SubmitStatusWeb Board

Description

  小火山最近喜歡上了圍棋。
  對於圍棋,其實小火山是一竅不通的。現在棋盤上,有很多小火山的棋子。 如果棋盤上有這樣的一個位置, 那麼這個位置也會變成小火山
的棋子;這樣的位置是指小火山的棋子將該位置圍起來。
  現在,小火山想知道實際棋盤是什麼樣子的。 你快來幫幫他吧!

Input

輸入第一行是一個整數T(T <= 30), 表示一共有T組數據。
每組數據,第一行爲兩個整數n, m(1 <= n, m <= 25),  隨後一個n*m的矩陣代表棋盤,其中"."是代表沒放棋子的位置, "*"代表小火山的棋子。

Output

對於每組數據輸出一個n*m的棋盤, 代表實際的棋盤。

Sample Input

2
3 3
***
*.*
***
4 4
.*..
*.*.
*.*.
.*..

Sample Output

Case 1:
***
***
***
Case 2:
.*..
***.
***.
.*..

HINT

Source

zzuli




ps:dfs搜索.
#include<stdio.h>
#include<string.h>
int dir[4][4]={{1,0},{0,1},{0,-1},{-1,0}},vis[100][100];
char a[110][110];
int m,n,flag=0;
void dfs(int x,int y)
{
    int xx,yy;
    for(int i=0;i<4;i++)
    {
         xx=x+dir[i][0];
         yy=y+dir[i][1];
    if(a[xx][yy]=='*'||vis[xx][yy])
        continue;
    if(xx<1||xx>=m-1||yy<1||yy>=n-1)
        {
            flag=0;//出界還沒遇到*說明沒被包圍,記錄flag=0,去除標記
            return ;
        }

   vis[xx][yy]=1;//標記查過的四個方向,防止重複查詢
    dfs(xx,yy);//向外搜索,直到找到包圍的*
    if(!flag)//可以優化,減小時間複雜度
        return ;
    }

}
int main()
{
    int t,z=0,i,j;
    scanf("%d",&t);
    while(t--)
    {
        z++;

        scanf("%d%d",&m,&n);

        for(i=0; i<m; i++)
        {scanf("%s",a[i]);
        }
        printf("Case %d:\n",z);
        for(i=1; i<m-1; i++)
            {for(j=1; j<n-1; j++)
            {
                 if(a[i][j]=='.')
                {
                    flag=1;
               memset(vis,0,sizeof(vis));//每次清零,使查過的可以繼續查詢
                    dfs(i,j);
                    if(flag)//標記成功的把.改爲*
                        a[i][j]='*';

                }
            }
            }
            for(i=0;i<m;i++)
            {
                    printf("%s\n",a[i]);
            }
    }
}


1905: 小火山的跳子游戲

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 460  Solved: 105

SubmitStatusWeb Board

Description

  小火山和火山火山在一塊玩跳子游戲。規則如下:
  1:跳子的起始位置爲0,棋盤大小從1到N
  2:每次跳子跳k步。 例如當前位置爲i, 那麼下一步爲i + k
  3:跳子過程中,碰到1或N則往回跳。例如當前位置爲4, N = 6, K = 5的
時候, 那麼下次跳子, 應該是 5, 6, 5 ,4, 3。最後落在3的位置, 再一次
跳子爲2 1 2 3 4。最後落在4的位置;
  現在小火山想知道經過任意次跳子最後能否將這個棋盤上的每個數字都走過。

Input

輸入第一行是一個整數T(T <= 20000), 表示一共有T組數據。
每一組數據都有兩個整數N, K(1 <= K ,N <= 5000)

Output

對於每組數據,如果可以將這個棋盤上的每個數字都走過則輸出"Yes", 否則輸出"No"

Sample Input

26 42 1

Sample Output

NoYes

HINT

Source

ps:找規律。。
#include<stdio.h>
int gcd(int a,int b)
{
    if(b==0)
        return a;
    else
        return gcd(b,a%b);
}
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&m);
        int k=gcd((n-1),m);
        if(k==1&&m%2!=0)//若m,n互質且m爲奇數輸出yes;
            printf("Yes\n");
        else
            printf("No\n");
    }
}

1913: 小火山的計算能力

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 481  Solved: 125

SubmitStatusWeb Board

Description

別人說小火山的計算能力不行,小火山很生氣,於是他想證明自己,現在有一個表達式,他想計算出來。

Input

首先是一個t(1<=20)表示測試組數。然後一個表達式,表達式長度不超過200,只有加法和減法,並且保證第一個字符不會是運算符號,最終結果小於2^63-1。

Output

輸出運算結果。

Sample Input

21+12+1-1

Sample Output

22

HINT

Source

ps:簡單的表達式求值。
#include<stdio.h>
#include<string.h>
char a[120];
int main()
{
    int t,f=2;
    long long sum;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",a);
        int l=strlen(a);
        a[l]='=';
        long long num=0;
        sum=0;
        f=2;
        for(int i=0;i<=l;i++)
        {
            if(a[i]>='0'&&a[i]<='9'&&f==2)
            {sum=sum*10+(a[i]-'0');
            }
            if(a[i]>='0'&&a[i]<='9'&&f==1)
            {
                sum=sum*10-(a[i]-'0');
            }
            if(a[i+1]=='+'||a[i+1]=='-'||a[i+1]=='=')
             num+=sum;
            if(a[i]=='-')
                {f=1;
                sum=0;
                }
            if(a[i]=='+')
                {f=2;
                sum=0;
                }
        }
        printf("%lld\n",num);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章