题解 P1683 【入门】
题解前送大家一句话:
注意:瓷砖可以重复走过,但不能重复计数
如果你有什么感想,就别看题解了,改改代码吧。
一开始没看到这句话,我zz还用了回溯。
结果,只AC了一个点(算是给我面子)
真是:
审题不认真,代码两行泪
#include <bits/stdc++.h>
using namespace std;
int x[10000001],y[100000001],ans,sum,w,h,qx,qy;
char c[1001][1001];
bool flag[1001][1001];
int py[]={0,-1,0,1,0},px[]={0,0,1,0,-1};//上下左右
int se(int sy,int sx){
// cout<<sy<<" "<<sx<<endl;
for(int i=1;i<=4;i++){
ans=max(ans,sum);
int dy=py[i]+sy,dx=px[i]+sx;
if(flag[dy][dx]==0&&c[dy][dx]=='.'&&dy<=h&&dy>0&&dx<=w&&dx>0){
flag[dy][dx]=1;
sum++;
se(dy,dx);
flag[dy][dx]=0;
sum--;
}
}
}
int main(){
cin>>w>>h;
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++){
cin>>c[i][j];
if(c[i][j]=='@')qx=j,qy=i;
}
sum++;
flag[qy][qx]=1;
se(qy,qx);
cout<<ans<<endl;
return 0;
}
这是该死的错误代码,欢迎拿走
正确代码:
哦对了,我是以第四象限建图的。
用bool标记;
走下步前先判断:
是否超界
是否走过(走过就不能计数了)
是否能走(即字符为‘.’)
#include <bits/stdc++.h>
using namespace std;
int x[10000001],y[100000001],ans,sum,w,h,qx,qy;
char c[1001][1001];
bool flag[1001][1001];
int py[]={0,-1,0,1,0},px[]={0,0,1,0,-1};//上下左右
int se(int sy,int sx){
// cout<<sy<<" "<<sx<<endl;
for(int i=1;i<=4;i++){
int dy=py[i]+sy,dx=px[i]+sx;
if(flag[dy][dx]==0&&c[dy][dx]=='.'&&dy<=h&&dy>0&&dx<=w&&dx>0){
flag[dy][dx]=1;
sum++;
se(dy,dx);
}
}
}
int main(){
cin>>w>>h;
for(int i=1;i<=h;i++)
for(int j=1;j<=w;j++){
cin>>c[i][j];
if(c[i][j]=='@')qx=j,qy=i;
}
sum++;
flag[qy][qx]=1;
se(qy,qx);
cout<<sum<<endl;
return 0;
}
请务必点赞,Thanks♪(・ω・)ノ