HDU1986- Encoding

蛇形填数问题,首先打表所有字母和空格的字符串,然后将输入的字母和空格编码为一个contain字符串,然后蛇形填数即可。
但是需要注意的是填数时要让下标小于r*c,所以contain字符串中要向后补‘0’。
一开始一直让下标小于contain的长度,但是怎么也过不了….

//HDU1986
#include <cstdio>
#include <cstring>
#include <string>

using namespace std;

char matrix[30][30];

string list[27] = {"00000", "00001", "00010", "00011",
 "00100", "00101", "00110", "00111", "01000", "01001",
 "01010", "01011", "01100", "01101", "01110", "01111",
 "10000", "10001", "10010", "10011", "10100", "10101",
 "10110", "10111", "11000", "11001", "11010"};

char s[500];

int main(int argc, char const *argv[]) {
    int T;
    scanf("%d", &T);
    for (int t = 1; t <= T; t++) {
        memset(matrix, '*', sizeof(matrix));
        int r, c;
        scanf("%d%d%*c", &r, &c);
        gets(s);

        string contain;
        for (int i = 0; i < strlen(s); i++) {
            int idx = (s[i] == ' ') ? 0 : s[i] - 'A' + 1;
            contain += list[idx];
        }
        contain.resize(400, '0');
        int i = 0, j = 0, k = 0;
        matrix[i][j] = contain[k++];
        while (k < r * c) {
            while (j + 1 < c && matrix[i][j+1] == '*') {
                matrix[i][++j] = contain[k++];
            }
            while (i + 1 < r && matrix[i+1][j] == '*') {
                matrix[++i][j] = contain[k++];
            }
            while (j - 1 >= 0 && matrix[i][j-1] == '*') {
                matrix[i][--j] = contain[k++];
            }
            while (i - 1 >= 0 && matrix[i-1][j] == '*') {
                matrix[--i][j] = contain[k++];
            }
        }

        printf("%d ", t);
        for (i = 0; i < r; i++) {
            for (j = 0; j < c; j++) {
                if (matrix[i][j] == '*') {
                    matrix[i][j] = '0';
                }
                printf("%c", matrix[i][j]);
            }
        }
        putchar('\n');
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值