Fork me on GitHub

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,纸盒考研等电梯研究队列
View Code

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         }
View Code

 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 }
View Code

用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 }
View Code

 

简介清爽,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 倍数的,可用平台评级为很水,这个评级为很难,感觉可用平台唯独这个评级不太准

回忆知乎各大竞赛难度排序
View Code

 

想不通打算对拍,结果那个参考博客里简短的实例可以,这个题就好久都没反应

玄学问题,手机电脑自行车放久了都不如之前用的时候

之前电脑记得还可以对拍,都挺快的,还可以给妈妈做制作,闲鱼做拜年视频运行PrAE啥的

现如今连个对拍都运行不了
View Code

哎,自己想吧

 读了下洛谷讨论里面叫__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 }

 最后关于数组越界问题之前博客,搜数组越界问题,越界之后输入赋值就已经乱了

posted @ 2024-09-18 21:54  GerJCS  阅读(20)  评论(0)    收藏  举报