POJ1562-Oil Deposits && HDOJ1241
接着刷邝斌飞搜索专题
POJ1562 1s 10000K
可用平台 1s 65536kB
洛谷 3s 0B
HDOJ1241 1s 32768K
太水了吧这题,10min写完代码,但感觉思维好弱边写边想,没法想好直接快速写
但这次洛谷和hdojAC了,poj和可用平台WA了(代码里用的是int map其实应该是char map,但没影响可忽略)

1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int m,n; 6 int map[100][100];//存地图 7 int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 8 int num; 9 int vis[100][100]; 10 int flag; 11 void dfs(int x,int y) 12 { 13 int thisx; 14 int thisy; 15 for(int i=0;i<8;i++){ 16 thisx=x+dir[i][0]; 17 thisy=y+dir[i][1]; 18 if(0<=thisx&&thisx<m&&0<=thisy&&thisy<n&& 19 map[thisx][thisy]=='@'&&vis[thisx][thisy]==0) 20 { 21 vis[thisx][thisy]=1; 22 dfs(thisx,thisy); 23 } 24 } 25 } 26 27 int main() 28 { 29 while(scanf("%d%d",&m,&n)&&m&&n){ 30 num=0; 31 flag=0; 32 memset(vis,0,sizeof(vis)); 33 getchar(); 34 for(int i=0;i<m;i++){ 35 for(int j=0;j<n;j++){ 36 scanf("%c",&map[i][j]); 37 } 38 getchar(); 39 } 40 41 for(int i=0;i<m;i++) 42 for(int j=0;j<n;j++){ 43 if(map[i][j]=='@'&&vis[i][j]==0){ 44 flag=1; 45 vis[i][j]=1; 46 dfs(i,j); 47 num=num+flag; 48 } 49 50 } 51 cout<<num<<endl; 52 } 53 }
这题是手在前,脑子在后,大概粗略写一遍就hdoj和洛谷AC了,这回轮到POJ和可用平台严谨了(可用平台一直挺严谨)
反复试验惊了,POJ的数据和洛谷数据输出居然不一样(这个题可用平台好像真的是从poj拉过来的数据,样例数据倒是一模一样)

用曾经的工具:different找不同,发现poj的数据5 5后面有个空格,操他妈的

回忆曾经北邮考研那些人连复制到控制台都不会,辅导HIT虹,辅导BUPT LXT,纸盒考研等电梯研究队列
看discss发现确实有多余空格(这题讨论区很精彩),想用字符串输入第一行,然后str[0],str[2]赋值给m,n,结果发现string或者char字符串,都是遇到空格就停止
想起来getline(),重新回顾参考博客
练习
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 string name; 7 getline(cin,name); 8 printf("%s\n",name.c_str()); 9 10 char name1[10]; 11 cin.getline(name1,13); 12 printf("%s\n",name1); 13 }//两种都可以索取第i个元素
实验代码,getline遇到回车就结束,且是抛弃,不输出参考博客,也不存于缓冲区
1 string ShaBiPOJ; 2 while(getline(cin,ShaBiPOJ)&&ShaBiPOJ[0]!='0' 3 &&ShaBiPOJ[2]!='0'){ 4 m=ShaBiPOJ[0]-48; 5 n=ShaBiPOJ[2]-48; 6 // while(scanf("%d%d",&m,&n)&&m&&n){ 7 num=0; 8 flag=0; 9 memset(vis,0,sizeof(vis)); 10 getchar(); 11 for(int i=0;i<m;i++){ 12 for(int j=0;j<n;j++){ 13 scanf("%c",&map[i][j]); 14 } 15 getchar(); 16 } 17 for(int i=0;i<m;i++){ 18 for(int j=0;j<n;j++){ 19 printf("%c",map[i][j]); 20 } 21 cout<<endl; 22 }
getchar吸收回车和空格
1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 char name; 7 name=getchar(); 8 printf("%c#",name); 9 }
用getline重写代码
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int m,n; 6 int map[100][100];//存地图 7 int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 8 int num; 9 int vis[100][100]; 10 int flag; 11 void dfs(int x,int y) 12 { 13 int thisx; 14 int thisy; 15 for(int i=0;i<8;i++){ 16 thisx=x+dir[i][0]; 17 thisy=y+dir[i][1]; 18 if(0<=thisx&&thisx<m&&0<=thisy&&thisy<n&& 19 map[thisx][thisy]=='@'&&vis[thisx][thisy]==0) 20 { 21 vis[thisx][thisy]=1; 22 dfs(thisx,thisy); 23 } 24 } 25 } 26 27 int main() 28 { 29 string ShaBiPOJ; 30 while(getline(cin,ShaBiPOJ)&&ShaBiPOJ[0]!='0' 31 &&ShaBiPOJ[2]!='0'){ 32 m=ShaBiPOJ[0]-48; 33 n=ShaBiPOJ[2]-48; 34 // while(scanf("%d%d",&m,&n)&&m&&n){ 35 num=0; 36 flag=0; 37 memset(vis,0,sizeof(vis)); 38 // getchar(); 39 for(int i=0;i<m;i++){ 40 for(int j=0;j<n;j++){ 41 scanf("%c",&map[i][j]); 42 } 43 getchar(); 44 } 45 46 for(int i=0;i<m;i++) 47 for(int j=0;j<n;j++){ 48 if(map[i][j]=='@'&&vis[i][j]==0){ 49 flag=1; 50 vis[i][j]=1; 51 dfs(i,j); 52 num=num+flag; 53 } 54 55 } 56 cout<<num<<endl; 57 } 58 } 59 60 //6 6 61 //*@@*** 62 //@**@** 63 //@***@* 64 //*@*@** 65 //**@**@ 66 //**@@@@
居然所有平台都WA,这是为啥啊我靠!!!!
决定回顾用户对拍,参考博客
写对拍随机生成数据代码的时候,发现绿色map之前用没事,用参考博客里的万能头文件就会报错,之前搁置了,发现应该是引用了头文件,之前绿色没事应该是没用对应的头文件,这里继续搁置,以后用到map的时候再研究,先改成其他头文件
但是报错了

于是在非codeblock的文件中创建了个对拍文件夹,把几个文件放进去还报这个错,添加下环境变量,参考博客里的代码倒是可以运行,自己写的还是不行
对拍问题先搁置
单独运行我写的随机生成样例的代码
1 //#include<bits/stdc++.h> 2 #include<stdio.h> 3 #include<iostream> 4 #include<time.h> 5 using namespace std; 6 char x[2]={'@','*'}; 7 char map[100][100]; 8 int main() { 9 srand(time(0) + (unsigned long long)(new char)); 10 11 int m = rand() % 100 + 1; 12 int n = rand() % 100 + 1; 13 cout<<m<<" "<<n<<endl; 14 for(int i=0;i<m;i++) 15 for(int j=0;j<n;j++){ 16 int num=rand() % 2 ; 17 map[i][j]=x[num]; 18 } 19 for(int i=0;i<m;i++){ 20 for(int j=0;j<n;j++) 21 cout<<map[i][j]; 22 cout<<endl; 23 } 24 return 0; 25 } 26 //10 6 27 //**@@** 28 //@****@ 29 //@*@@@* 30 //@***** 31 //*@*@*@ 32 //@*@*@@ 33 //*@*@*@ 34 //@*@@** 35 //@@@**@ 36 //*@@@**
得到如下样例
10 6 **@@** @****@ @*@@@* @***** *@*@*@ @*@*@@ *@*@*@ @*@@** @@@**@ *@@@**
运行我写的getline获取一行string类型的ShaBiPOJ代码的时候,居然出错了
进一步验证发现输入10 16,转为m,n的时候,m,n是1,-16
妈的知道了,10是两位,我的写法只吸收了1的这一位,这也就是为什么样例可以过,样例就是个位的m,n
没法用getline
改用判断,是空格就跳过,四个平台全部AC

AC代码(单个输入字符)
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int m,n; 6 char map[100][100];//存地图 7 int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 8 int num; 9 int vis[100][100]; 10 int flag; 11 string ShaBiPOJ; 12 void dfs(int x,int y) 13 { 14 int thisx; 15 int thisy; 16 for(int i=0;i<8;i++){ 17 thisx=x+dir[i][0]; 18 thisy=y+dir[i][1]; 19 if(0<=thisx&&thisx<m&&0<=thisy&&thisy<n&& 20 map[thisx][thisy]=='@'&&vis[thisx][thisy]==0) 21 { 22 vis[thisx][thisy]=1; 23 dfs(thisx,thisy); 24 } 25 } 26 } 27 int main() 28 { 29 while(scanf("%d%d",&m,&n)&&m&&n){ 30 num=0; 31 flag=0; 32 memset(vis,0,sizeof(vis)); 33 char c=getchar(); 34 if(c==' ') 35 getchar(); 36 if(c=='\n') 37 ; 38 // printf("%d %d\n",m,n); 39 for(int i=0;i<m;i++){ 40 for(int j=0;j<n;j++){ 41 scanf("%c",&map[i][j]); 42 } 43 getchar(); 44 } 45 for(int i=0;i<m;i++) 46 for(int j=0;j<n;j++){ 47 if(map[i][j]=='@'&&vis[i][j]==0){ 48 flag=1; 49 vis[i][j]=1; 50 dfs(i,j); 51 num=num+flag; 52 } 53 54 } 55 cout<<num<<endl; 56 } 57 }
好了,回头看对拍,逐个解决,说'g++' 不是内部或外部命令,也不是可运行的程序,解决办法
怎么打开bat文件没反应了
噢,我tm等一年才有反应,不过没报错了,挺好
继续看POJ讨论
吃掉第一行5 5后空格的好写法
再学另一种写法
了解到字符串忽略前导空格前导回车,读取第一个非空格非回车字符,到第一个空格结束
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char str[10]; 6 scanf("%s",&str); 7 printf("%s\n",str); 8 }
简介清爽,POJ和HDOJ上AC了,但可用平台和洛谷都WA了

AC代码(直接输入字符串写法,不用考虑傻逼POJ这种第一行5 5后还有空格的情况,不用考虑单个输入字符要getchar回车的情况)
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int m,n; 6 char map[100][100];//存地图 7 int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 8 int num; 9 int vis[100][100]; 10 int flag; 11 string ShaBiPOJ; 12 void dfs(int x,int y) 13 { 14 int thisx; 15 int thisy; 16 for(int i=0;i<8;i++){ 17 thisx=x+dir[i][0]; 18 thisy=y+dir[i][1]; 19 if(0<=thisx&&thisx<m&&0<=thisy&&thisy<n&& 20 map[thisx][thisy]=='@'&&vis[thisx][thisy]==0) 21 { 22 vis[thisx][thisy]=1; 23 dfs(thisx,thisy); 24 } 25 } 26 } 27 int main() 28 { 29 while(scanf("%d%d",&m,&n)&&m&&n){ 30 num=0; 31 flag=0; 32 memset(vis,0,sizeof(vis)); 33 for(int i=0;i<m;i++) 34 scanf("%s",&map[i]); 35 for(int i=0;i<m;i++) 36 for(int j=0;j<n;j++){ 37 if(map[i][j]=='@'&&vis[i][j]==0){ 38 flag=1; 39 vis[i][j]=1; 40 dfs(i,j); 41 num=num+flag; 42 } 43 44 } 45 cout<<num<<endl; 46 } 47 }
这个可用平台是真牛逼啊,取众家之所长,数据是最严谨的,可用平台>洛谷>hdoj>poj。上一个题find 倍数的,可用平台评级为很水,这个评级为很难,感觉可用平台唯独这个评级不太准
回忆知乎各大竞赛难度排序
想不通打算对拍,结果那个参考博客里简短的实例可以,这个题就好久都没反应
玄学问题,手机电脑自行车放久了都不如之前用的时候
之前电脑记得还可以对拍,都挺快的,还可以给妈妈做制作,闲鱼做拜年视频运行PrAE啥的
现如今连个对拍都运行不了
哎,自己想吧
读了下洛谷讨论里面叫__Watcher的思路,提到n*m会超过10000,不理解为啥,狐疑的改成map[105][105]他么的居然过了??那我最开始也是洛谷map[100][100]咋就过了??
回忆v8说可能会有超过的情况,最好多开5个,当时他没细说
又缩小成map[100][101]也过了
起初觉得m,n输入可能是100 100最大,但数据会输入100+ 100+,可实践发现1 1,@@就直接结束程序了,所以也不是这个原因,尝试了下int,%d,如果输入@会是啥,实践发现没啥值得探讨东西(输出0 16,不管这个),再深入思考, map[100][100] 在最开始的代码里,2个for,针对性的单个字符输入,没问题,但如果为了避免像poj一样第一行5 5后还有空格,而用1个for,输入字符串,则就要 map[100][101] 了。个人猜测是字符串会自动加一个‘\0’,而导致越界,数组越界在简单样例中没明显问题,但其他复杂数据就不知道了,我垃圾电脑也没法对拍,╮(╯▽╰)╭。经常就硬盘(3F0)故障要放电。
强迫看懂别人代码好拉扯,q神慰藉不看
这样还是挺好的,那些无脑直接开好几百数组的,肯定不会遇到这个坑,也就没这么深入的思考
AC代码:四个平台均AC(字符串输入版,必须多开一列数组,即map[100][101])

1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int m,n; 6 char map[100][101];//存地图 7 int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}}; 8 int num; 9 int vis[100][100]; 10 int flag; 11 string ShaBiPOJ; 12 void dfs(int x,int y) 13 { 14 int thisx; 15 int thisy; 16 for(int i=0;i<8;i++){ 17 thisx=x+dir[i][0]; 18 thisy=y+dir[i][1]; 19 if(0<=thisx&&thisx<m&&0<=thisy&&thisy<n&& 20 map[thisx][thisy]=='@'&&vis[thisx][thisy]==0) 21 { 22 vis[thisx][thisy]=1; 23 dfs(thisx,thisy); 24 } 25 } 26 } 27 int main() 28 { 29 while(scanf("%d%d",&m,&n)&&m&&n){ 30 num=0; 31 flag=0; 32 memset(vis,0,sizeof(vis)); 33 for(int i=0;i<m;i++) 34 scanf("%s",&map[i]); 35 36 for(int i=0;i<m;i++) 37 for(int j=0;j<n;j++){ 38 if(map[i][j]=='@'&&vis[i][j]==0){ 39 flag=1; 40 vis[i][j]=1; 41 dfs(i,j); 42 num=num+flag; 43 } 44 45 } 46 cout<<num<<endl; 47 } 48 }


浙公网安备 33010602011771号