UVA1003(dfs+进制转换)

题意:输入很多字符的16进制数,现在需要你先转化为2进制,之后二进制中1和0组成的字符需要你求出来。

思路:字符每一个都有所不同可以靠圆圈的数目求出。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int gragh[1000][1000];
int n,m;
int ans;
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};

void change(char c,int x,int y)
{
    if(c >= ‘0‘ && c <= ‘9‘){
        int d = c - ‘0‘;
        gragh[x][(y-1)*4+4] = d%2;d /= 2;
        gragh[x][(y-1)*4+3] = d%2;d /= 2;
        gragh[x][(y-1)*4+2] = d%2;d /= 2;
        gragh[x][(y-1)*4+1] = d%2;
    }
    else {
        int d = c - ‘a‘ + 10;
        gragh[x][(y-1)*4+4] = d%2;d /= 2;
        gragh[x][(y-1)*4+3] = d%2;d /= 2;
        gragh[x][(y-1)*4+2] = d%2;d /= 2;
        gragh[x][(y-1)*4+1] = d%2;
    }
}

void dfs1(int x,int y)      //作用是把1.没用的0清掉 2.没遇到一种情况就把0清掉
{
    gragh[x][y] = -1;
    for(int i = 0;i < 4; i++){
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && gragh[xx][yy] == 0){
            dfs1(xx,yy);
        }
    }
}

void dfs2(int x,int y)
{
    gragh[x][y] = -1;
    for(int i = 0;i < 4; i++){
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && gragh[xx][yy] == 0){
            ans++;          //记录每一种字符的圈数
            dfs1(xx,yy);
        }
        else if(xx >= 1 && xx <= n && yy >= 1 && yy <= m && gragh[xx][yy] == 1){
            dfs2(xx,yy);
        }
    }
}

int main()
{
  //  freopen("in.txt","r",stdin);
    int ncase = 1;
    while(scanf("%d%d",&n,&m) != EOF){
        if(n == 0 && m == 0)
            break;

        memset(gragh,0,sizeof(gragh));

        char a[100];
        for(int i = 1;i <= n; i++){
            scanf("%s",a+1);
            for(int j = m;j >= 1; j--){
                change(a[j],i,j);       //分别是十六进制的数,第几行,第几列
            }
        }

        m *= 4;
        for(int i = 1;i <= n; i++){
            if(gragh[i][1] == 0){
                dfs1(i,1);
            }
            if(gragh[i][m] == 0){
                dfs1(i,m);
            }
        }
        for(int j = 1;j <= m; j++){
            if(gragh[1][j] == 0){
                dfs1(1,j);
            }
            if(gragh[n][j] == 0){
                dfs1(n,j);
            }
        }
        int pos = 0;
        char s[100];
        for(int i = 1;i <= n; i++){
            for(int j = 1;j <= m; j++){
                ans = 0;
                if(gragh[i][j] == 1){
                    dfs2(i,j);
                    if(ans == 1)
                        s[pos++] = ‘A‘;
                    else if(ans == 3)
                        s[pos++] = ‘J‘;
                    else if(ans == 5)
                        s[pos++] = ‘D‘;
                    else if(ans == 4)
                        s[pos++] = ‘S‘;
                    else if(ans == 0)
                        s[pos++] = ‘W‘;
                    else if(ans == 2)
                        s[pos++] = ‘K‘;
                }
            }
        }
        sort(s,s+pos);
        printf("Case %d: ",ncase++);
        for(int i = 0;i < pos; i++)
            printf("%c",s[i]);
        printf("\n");
    }
    return 0;
}
时间: 2024-08-02 05:13:15

UVA1003(dfs+进制转换)的相关文章

任意进制转换算法

任意进制转换算法 N年没有写博客,发个进制转换的玩下,支持负数:功能属于简化版的 Convert.ToInt32 ,特点是: 1.任意位,如:0,1(二进制),0...7(八进制),0...9,A...F(16进制),0...N(N进制),或者是:[email protected]#$%^&*(8进制,字符符号),也可以是中文. 2.8 byte 最大长度. 3.C#源码. 最近写markdown格式习惯啦,cnblogs啥时候全改掉算了,别用这个htmleditor算了. 先说明下进制转换的基

03 php 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换,算术运算,比较运算

03 数据类型:整数,进制转换,浮点,字符,布尔,数组,空类型,类型转换, 算术运算,比较运算,逻辑运算,短路现象, 三目运算符,字符型运算: 数据类型 整体划分 标量类型: int, float, string, bool 复合类型: array,     object 特殊类型: null,     resouce 整数类型int, integer 3种整数表示法 十进制写法:123: $n1 = 123; 八进制写法: 0123 $n2 = 0123; 十六进制写法: 0x123 $n3

计算机进制转换

一.计算机只认识0和1,二进制. 二.2进制转换成 8进制 和 16进制,如下图: 二进制 > 八进制 :  研究上图发现,3位最高二进制可以用来表示一位八进制.所以,将二进制分解每3位,不够前面补0,然后每3位转换为10进制,顺序排列即可. 二进制 > 十六进制  :4位最高二进制可以用来表示一位十六进制.所以,将二进制分解每4位,不够前面补0,然后每4位转换为10进制,超过9用字母表示即可.顺序排列即可. 如下: 二进制 > 十进制:   11001001 = 2^7+2^6+2^3

原理之一,进制转换

原理之一,进制转换 日常生活中采用个数字都是十进制,而计算机采用的是运算更简单.易实现且可靠,为逻辑设计提供了有力途经的二进制,除此之外还有八进制和十六进制作为二进制的缩写. 进制:逢N进一,N是每种进位计数制表示一位数所需要的符号数目为基数. 二进制:逢二进一,借一当二,包含的数字(0.1) 八进制:逢八进一,借八当一,包含(0.1.2.3.4.5.6.7) 十六进制:逢十六当一,以一当十六,包含(0.1.2.3.4.5.6.7.8.9.10(A).11(B).12(C).13(D).14(E

NOIP2000 进制转换

题一   进制转换              (18分)  问题描述      我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*102+2*101+3*100这样的形式. 与之相似的,对二进制数来说,也可表示成每个二进制数码乘以一个以该数字所处位置的(值-1)为指数,以2为底数的幂之和的形式.一般说来,任何一个正整数R或一个负整数-R都可以被选来作为一个数制系统的基数.如果是以R或-R为基

进制进制进制~转换

从刚学计算机器就对进制转换有着莫名的反感,2进制 8进制 10进制 16进制各种转换. 下面就说下逻辑地址转换成物理地址的求法吧 首先,用户输入一个16进制的数字cin>>hex>>logic_add;   hex的意思是告诉计算机输入的数是以16进制方式输入的 这个时候你要是输出cout<<logic_add;  你会发现输出的是把这个16进制的数转换为10进制以后输出的结果 cout<<hext<<logic_add;这样输出的才是16进制.

黑马程序员------进制转换

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 在java中数字的表现形式一般有二进制,八进制,十进制,十六进制等,在平时的编程中我们可以通过java提供的API函数方便的实现各个进制间的转换,如:Integer.toHexString(int i)--十进制转十六进制:Integer

c语言之进制转换(栈实现)

从上两篇博客中我们可以知道,栈具有后进先出的特性,而进制转换的打印输出刚好与计算过程相反,满足栈这后进先出的特性, 所以可以用栈很快的实现进制转换,下面是用栈实现进制转换的c函数 void conversion (SqStack *pstack,unsigned int N, const unsigned int d){ if( pstack == NULL)//当传入参数为指针,必须判空 exit(-1); int mod ;//保存mod = N %d while( N != 0){ mod

进制转换-课后作业

一. 其他进制转换成十进制 1.十六进制转成十进制 41bd  = 4*16^3+1*16^2+11*16+13 = 16384+256+176+13=16829 a10c.8  = 10*16^3+1*16^2+0+12  .  8/16 = 40960+256+12.5=41228.5 2.八进制转成十进制 146.1  = 1*8^2+4*8+6 . 1/8 = 64+32+6.125=102.125 5312.2  = 5*8^3+3*8^2+1*8+2 . 2/8 = 2560+192