看图写树,紫书P170UVa10562(c++输入问题汇总)

来源:互联网 发布:java选择结构的种类 编辑:程序博客网 时间:2024/06/05 09:44

本题算法考察非常简单,可笔者在做题过程中因为字符的读入问题可谓是漏洞百出。提交了两次都是wa,还是基本功不扎实。主要问题都集中在字符处理问题上。

关于c++字符输入问题的最终详细总结:
1.cin几乎等同于scanf(“%s”),这两种读取字符串的方式都是遇到空格和回车就停止。读取的字符串末尾自动补齐‘\0’.最重要的是,不会带走缓冲区里面的换行符。
2.gets(arr), 从标准流中读取一整行字符,直到遇到回车才停止。读取的字符串末尾自动补齐‘\0’。最重要的是,它带走缓冲区里面的换行符。
3.fgets(arr, num, position), 从目标地址处(position)读取num-1个字符。重点强调是num-1个字符,不是num个,因为最后一个位置会被自动补齐‘\0’。*最重要的是,不会带走缓冲区里面的空格与换行符。* 也就是说,fgets(arr, num, position)是cin与scanf(“%s”)的特别版(能指定读取字符数量与地址)。
4.getchar(), 只读取一个字符,无论什么字符它都读,什么空格换行它都读。它就是单字符的操作,* 不会在读取的字符串末尾加什么‘\0’,也不会带走缓冲区里面的空格与换行符。*

至于本题的思路就比较简单,多支树的dfs遍历。
下面是自己的代码:

// UVa297 Quadtrees// scienceZ#include <cstdio>#include <vector>#include <iostream>#include <cstring>using namespace std;char arr[250][250];string ans;int n;void dfs(int i, int j){    ans.push_back(arr[i][j]);    ans.push_back('(');    int l = j, r = j;    if(arr[i+1][j] == '|'){        while(arr[i+2][l-1] == '-') l--;        while(arr[i+2][r+1] == '-') r++;        for (; l<=r; l++) if(arr[i+3][l] != ' ' && arr[i+3][l] != 0) dfs(i+3, l);    }    ans.push_back(')');}int main(){    cin >> n;    while(n--){        memset(arr, 0, sizeof(arr));        ans.clear();        int i = 0, j = 0;        char t = getchar();        while (t == '\n') t = getchar();        while(t != '#'){            if (t != '\n'){arr[i][j] = t; j++;}            else {i++; j = 0;}            t = getchar();        }        ans.push_back('(');        for(int j = 0; j < 209; j++) if (arr[0][j] != ' ' && arr[0][j] != 0){dfs(0, j);break;}          ans.push_back(')');        cout << ans << endl;    }    return 0;} 
原创粉丝点击