Home
Problem
Status
Contest
Workbook
User
Group
Forum
Register
Login
{"managingGroups":{},"author":"KyrieLink","updateTime":1505961838000,"title":"uva297为什么两种代码,主程序是一样的,就是数组定义的长度不同,但第一个越界提交了是AC,第二个没AC越界提交也是AC","dislikeCnt":0,"content":"对应UVA 297四分树\n\n```\n// UVa297 Quadtrees\n// Rujia Liu\n// 题意:给两棵四分树的先序遍历,求二者合并之后(黑色部分合并)黑色像素的个数。p表示中间结点,f表示黑色(full),e表示白色(empty)\n// 算法:先建树,然后统计\n#include\u003ccstdio\u003e\n#include\u003ccstring\u003e\n\nconst int len \u003d 32;\nconst int maxn \u003d 1024 + 10;\nchar s[maxn];//这里叶节点最多就会有1024个了,但不是还没父节点吗,不会越界吗,虽然提交的是AC。\nint buf[len][len], cnt;\n\n// 把字符串s[p..]导出到以(r,c)为左上角,边长为w的缓冲区中\n// 2 1\n// 3 4\nvoid draw(const char* s, int\u0026 p, int r, int c, int w) {\n char ch \u003d s[p++];\n if(ch \u003d\u003d \u0027p\u0027) {\n draw(s, p, r, c+w/2, w/2); // 1\n draw(s, p, r, c , w/2); // 2\n draw(s, p, r+w/2, c , w/2); // 3\n draw(s, p, r+w/2, c+w/2, w/2); // 4\n } else if(ch \u003d\u003d \u0027f\u0027) { // 画黑像素(白像素不画)\n for(int i \u003d r; i \u003c r+w; i++)\n for(int j \u003d c; j \u003c c+w; j++)\n if(buf[i][j] \u003d\u003d 0) { buf[i][j] \u003d 1; cnt++; }\n }\n}\n\nint main() {\n int T;\n freopen(\"/Users/user/Desktop/1.txt\",\"r\",stdin);\n scanf(\"%d\", \u0026T);\n while(T--) {\n \n memset(buf, 0, sizeof(buf));\n cnt \u003d 0;\n for(int i \u003d 0; i \u003c 2; i++) {\n scanf(\"%s\", s);\n // int leng \u003d strlen(s);\n // printf(\"%d \",leng);\n int p \u003d 0;\n draw(s, p, 0, 0, len);\n // printf(\"%d\\n\",p);\n // printf(\"%s\\n\",s);\n }\n printf(\"There are %d black pixels.\\n\", cnt);\n }\n return 0;\n}\n//下面是我自己写的程序,改成2*maxn后才ac。\n\nconst int maxn \u003d 1024 + 10;\nint buf[maxn][maxn];\nint len \u003d 32;\nchar s[2*maxn];//之前用maxn越界了\nint cnt;\nint p;\n\nvoid draw(int r,int c,int w)//p指针\n{\n char ch \u003d s[p++];\n if(ch \u003d\u003d\u0027p\u0027)\n {\n draw(r,c,w/2);\n draw(r,c+w/2,w/2);\n draw(r+w/2,c,w/2);\n draw(r+w/2,c+w/2,w/2);\n }\n else if(ch \u003d\u003d \u0027f\u0027)\n {\n for(int i \u003d r; i \u003c r+w; i++)\n for(int j \u003d c; j \u003c c+w; j++)\n if(!buf[i][j])\n {\n buf[i][j] \u003d 1;\n cnt++;\n }\n }\n}\nint main()\n{\n int T;\n //freopen(\"/Users/user/Desktop/1.txt\",\"r\",stdin);\n scanf(\"%d\",\u0026T);\n while(T--)\n {\n cnt \u003d 0;\n p \u003d 0;\n memset(buf,0,sizeof(buf));\n scanf(\"%s\",s);\n draw(0,0,len);\n //cout \u003c\u003c s\u003c\u003cendl;\n //cout \u003c\u003c p \u003c\u003c endl;\n scanf(\"%s\",s);\n //cout \u003c\u003c s \u003c\u003c endl;\n p \u003d 0;\n draw(0,0,len);\n printf(\"There are %d black pixels.\\n\",cnt);\n }\n return 0;\n}\n\n```","threadId":18358,"likeCnt":0,"createTime":1505961838000,"isWorkbook":false,"viewCnt":2788,"openness":2,"fav":false,"id":236,"trustable":false}