既然水题是水题赛,学到的东西就主要是来自代码风格上的了。
①复制数组要用memcpy,循环是较慢的。
②跳马那道题我竟然还判断了一下其是否会越界,但实际上,越界是不可能发生的,以后这种边界情况我必须要仔细推敲才好。
③最后一道题我还开了两个Bool数组来判断某个点是否是水及是否经过过,实际上这两个是完全可以合并的。
代码:
分组:
①复制数组要用memcpy,循环是较慢的。
②跳马那道题我竟然还判断了一下其是否会越界,但实际上,越界是不可能发生的,以后这种边界情况我必须要仔细推敲才好。
③最后一道题我还开了两个Bool数组来判断某个点是否是水及是否经过过,实际上这两个是完全可以合并的。
代码:
分组:
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<cstdlib>
- typedef short hd;
- hd n,m,ans[91][11],tot,tmp[10];
- void dfs(hd x,hd pred,hd sum){
- if(sum+pred*(m-x)>n)return;
- if(x==m){
- if(n-sum>=pred)
- {
- for(hd i=1;i<m;++i)
- ans[tot][i]=tmp[i];
- ans[tot++][m]=n-sum;
- }
- return;
- }
- for(hd i=pred;i<n;++i){
- tmp[x]=i;
- dfs(x+1,i,sum+i);
- }
- }
- int main(){
- freopen("dataa.in","r",stdin),freopen("dataa.out","w",stdout);
- scanf("%hd%hd",&n,&m);
- dfs(1,1,0);
- printf("%hd\n",tot);
- ++m;
- for(hd i=0;i<tot;++i){
- for(hd j=1;j<m;++j)
- printf("%hd ",ans[i][j]);
- printf("\n");
- }
- }
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- int f[21][21];
- int main(){
- freopen("horse.in","r",stdin),freopen("horse.out","w",stdout);
- short i,j,m,n;
- scanf("%hd%hd",&m,&n);
- f[1][1]=1;
- for(i=2;i<=n;++i)
- for(j=1;j<=m;++j){
- if(j+2<=m)f[i][j]+=f[i-1][j+2];
- if(j-2>0)f[i][j]+=f[i-1][j-2];
- if(i-2>0&&j-1>0)f[i][j]+=f[i-2][j-1];
- if(i-2>0&&j+1<=m)f[i][j]+=f[i-2][j+1];
- }
- printf("%d",f[n][m]);
- }
- 最大的湖:
- #include<iostream>
- using namespace std;
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- typedef short hd;
- bool p[101][101],flag[101][101];
- hd N,M;
- hd dfs(hd x,hd y){
- flag[x][y]=1;
- hd ans=1;
- if(x+1<N&&!flag[x+1][y]&&p[x+1][y])ans+=dfs(x+1,y);
- if(x-1&&!flag[x-1][y]&&p[x-1][y])ans+=dfs(x-1,y);
- if(y+1<M&&!flag[x][y+1]&&p[x][y+1])ans+=dfs(x,y+1);
- if(y-1&&!flag[x][y-1]&&p[x][y-1])ans+=dfs(x,y-1);
- return ans;
- }
- int main(){
- freopen("lake.in","r",stdin),freopen("lake.out","w",stdout);
- hd i,j,K,ans=0,R,C;
- scanf("%hd%hd%hd",&N,&M,&K);
- ++N,++M;
- for(i=0;i<K;++i){
- scanf("%hd%hd",&R,&C);
- p[R][C]=1;
- }
- for(i=1;i<N;++i)
- for(j=1;j<M;++j)
- if(!flag[i][j]&&p[i][j])
- ans=max(dfs(i,j),ans);
- printf("%hd",ans);
- }