FJNU OJ 1105

GoldCoder Run #4 div.1
A题

Problem A: 捧杯辰的游戏
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 19 Solved: 5

Submit Status Discuss
Description
我们都知道,捧杯辰是数计ACM的希望,引领数计ACM夺回曾经的荣耀!由于捧杯辰经常忘我的刷着题目,经常晚归宿舍,不要说门禁了,捧杯辰有100种方式轻松出入宿舍。但是还有查房!!!保卫部发现捧杯辰晚归宿舍,上报梁老板,然而梁老板知道捧杯辰不是他能惹得起的人,因此假装跟捧杯辰说:我这里有一个9*9的板子,共81个小格子,他们被格子边沿的小墙分成了不规则的几个部分,格子中有一个数,表示一些隐藏的bug

每个格子上面有一个整数,它由以下元素组成:

16:格子上边有墙

32:格子右边有墙

64:格子下边有墙

128:格子左面有墙

现在呢,我会告诉你这一个9*9上面的bug信息,你能分好块就允许你晚归回宿舍!!!

捧杯辰一听,我去,这么简单的题目,哥根本不想做啊,唉,算了,为了可以名正言顺的晚归,还是叫学弟帮忙搞一下吧,哥还是适合world final的题目啊……

所以这个简单的题目就留个学弟解决了=_=

Input
第一行,一个整数T,表示梁老板给了T个要分的板块
接下来每个板块由9行组成,其中没一行由9个整数组成,整数的意思去问捧杯辰

Output
对于给定的板块,给每个格子从1开始标上它属于的板块号,从左到右,从上到下编号呦

Sample Input
2
144 16 112 208 80 16 48 144 48
128 32 144 80 112 128 96 128 32
128 32 160 144 112 160 208 0 32
192 96 160 160 208 96 176 192 96
208 80 32 192 80 48 128 80 112
144 48 224 144 112 160 160 144 48
128 0 112 160 208 96 160 128 32
128 32 144 32 208 80 96 128 32
192 96 192 64 80 112 208 64 96

240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
240 240 240 240 240 240 240 240 240
Sample Output
Case 1:
1 1 1 2 2 2 2 3 3
1 1 4 4 4 2 2 3 3
1 1 4 5 5 2 3 3 3
1 1 4 5 2 2 6 3 3
4 4 4 5 5 5 6 6 6
7 7 4 8 8 5 6 9 9
7 7 7 8 5 5 6 9 9
7 7 8 8 6 6 6 9 9
7 7 8 8 8 8 9 9 9
Case 2:
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54
55 56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81
HINT
如果一个格子的整数是80, 即由16+64组成,那么就说明这个格子,上面跟下面有堵墙

解释:
麻烦得要死。。实际上就是dfs就没了

#include "cstring"
#include "iostream"
#include "string.h"
#include "cstdio"


#define upright 48
#define updown 80
#define upleft 144
#define updownleft 208
#define updownright 112
#define upleftright 176
#define downright 96
#define downleft 192
#define downleftright 224
#define leftright 160
#define all 240
#define up 16
#define down 64
#define right 32
#define left 128

using namespace std;

int a[15][15];
int ans[15][15];
int vis[15][15];
int cnt;


void search(int i, int j)
{
    if (i < 1 || j < 1 || i>9 || j>9||vis[i][j]==1)
        return;

    vis[i][j] = 1;
    ans[i][j] = cnt;
    if (a[i][j] == upright)
    {
        search(i + 1, j);
        search(i, j - 1);
    }
    if (a[i][j] == updown)
    {
        search(i, j + 1);
        search(i, j - 1);

    }
    if (a[i][j] == upleft)
    {
        search(i, j + 1);
        search(i + 1, j);
    }
    if (a[i][j] == updownleft)
    {
        search(i, j + 1);
    }
    if (a[i][j] == updownright)
    {
        search(i, j - 1);
    }
    if (a[i][j] == upleftright)
    {
        search(i + 1, j);
    }
    if (a[i][j] == downright)
    {
        search(i - 1, j);
        search(i, j - 1);
    }
    if (a[i][j] == downleft)
    {
        search(i, j + 1);
        search(i - 1, j);
    }
    if (a[i][j] == downleftright)
    {
        search(i-1,j);
    }
    if (a[i][j] == leftright)
    {
        search(i+1, j);
        search(i - 1, j);
    }
    if (a[i][j] == up)
    {
        search(i +1, j);
        search(i , j+1);
        search(i , j-1);
    }
    if (a[i][j] == down)
    {
        search(i - 1, j);
        search(i, j + 1);
        search(i, j - 1);
    }
    if (a[i][j] == left)
    {
        search(i+1, j );
        search(i-1, j );
        search(i, j + 1);
    }
    if (a[i][j] == right)
    {
        search(i + 1, j);
        search(i - 1, j);
        search(i, j - 1);
    }
    if (a[i][j] == all)
    {
        return;
    }
    if (a[i][j] == 0)
    {
        search(i + 1, j);
        search(i - 1, j);
        search(i, j - 1);
        search(i, j + 1);
    }
}



int main()
{
    int t;
    while (scanf("%d", &t) != EOF)
    {
        for (int k = 1; k <= t; k++)
        {
            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                    scanf("%d", &a[i][j]);
            }
            cnt = 0;
            memset(vis, 0, sizeof(vis));


            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    if (vis[i][j] == 0)
                        cnt++;
                    search(i, j);

                }
            }

            printf("Case %d:\n", k);

            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= 9; j++)
                {
                    if (j == 9)
                    {
                        printf(" %d\n", ans[i][j]);
                        continue;
                    }
                    if (j == 1)
                    {
                        printf("%d", ans[i][j]);
                        continue;
                    }
                    printf(" %d", ans[i][j]);

                }
            }



        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值