HDU1986- Encoding

来源:互联网 发布:宁波淘宝开店培训机构 编辑:程序博客网 时间:2024/06/06 04:49

蛇形填数问题,首先打表所有字母和空格的字符串,然后将输入的字母和空格编码为一个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;}
0 0