9 条题解
-
5
本蒟蒻觉得这题不是很难废话不多说,直接上代码。-_-#include<bits/stdc++.h> using namespace std; typedef long long ull;//对long long 的自定义 const int fx[]={0 , -2, -1, 1, 2, 2, 1, -1, -2}; const int fy[]={0 , 1, 2, 2, 1, -1, -2, -2, -1}; int bx,by,mx,my; ull f[30][30]; bool s[30][30]; int main(){ cin.tie(0); cout.tie(0);//加速读写,输出 cin>>bx>>by>>mx>>my; bx+=2, by+=2, mx+=2, my+=2; f[2][2]=1; for(int i=0;i<=8;i++) s[fx[i]+mx][fy[i]+my]=1; for(int i=2; i<=bx; i++){ for(int j=2; j<=by; j++){ if(s[i][j]==1) continue; f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]); } } cout<<f[bx][by]; return 0; }
就是简单嘛 -
2
#include<iostream> #include<string> #include<algorithm> #define ll long long using namespace std; const int fx[] = { 0,-2,-1,1,2,2,1,-1,-2 }; const int fy[] = { 0,1,2,2,1,-1,-2,-2,-1 }; //马可以走到的位置 int bx, by, nx, my; ll lj[40][40]; bool s[40][40];//判断这个点能不能走 int main() { //c scanf输入数据 printf输出数据 cin >> bx >> by >> nx >> my; bx += 2; by += 2; nx += 2; my += 2; lj[1][2] = 1;//初始化让lj[2][2]=1; s[nx][my] = 1; for (int i = 1; i <= 8; i++) { s[nx + fx[i]][my + fy[i]] = 1; } for(int i=2;i<=bx;i++) for (int j = 2; j <=by; j++) { if (s[i][j]) { continue;//lj[i][j] = 0; } lj[i][j] = lj[i - 1][j] + lj[i][j - 1]; } cout << lj[bx][by] << endl; //return 0; } // // __ __ __ // / / / /_ ______/ /________ // / /_/ / / / / __ / ___/ __ \ // / __ / /_/ / /_/ / / / /_/ / // /_/ /_/\__, /\__,_/_/ \____/ // /____/ //
-
0
#include<bits/stdc++.h> using namespace std; typedef long long ull; const int fx[]={0 , -2, -1, 1, 2, 2, 1, -1, -2}; const int fy[]={0 , 1, 2, 2, 1, -1, -2, -2, -1}; int bx,by,mx,my; ull f[30][30]; bool s[30][30]; int main(){ cin.tie(0); cout.tie(0); cin>>bx>>by>>mx>>my; bx+=2, by+=2, mx+=2, my+=2; f[2][2]=1; for(int i=0;i<=8;i++) s[fx[i]+mx][fy[i]+my]=1; for(int i=2; i<=bx; i++){ for(int j=2; j<=by; j++){ if(s[i][j]==1) continue; f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]); } } cout<<f[bx][by]; return 0; }
-
0
using namespace std; int a[10000][10000];//表示到达每个坐标的走法 int g[10000][10000];//这个数组用来保存被马控制的点,控制了为1,没被控制为0 int main(){ int n,m,x,y,x1,y1; int h[8]={-2,-1,1,2,2,1,-1,-2}; int l[8]={-1,-2,-2,-1,1,2,2,1};//用两个一位数组表示马向八个方向移动的变化方式 cin>>n>>m>>x>>y; for(int i=0;i<8;i++){//循环的方式来实现马向八个方向移动 x1=x+h[i]; y1=y+l[i];//计算出新的马控制坐标 if(x1>=0&&x1<=n&&y1>=0&&y1<=m) g[x1][y1]=1;//如果新坐标在棋盘内部,那么标记此处被马控制 } g[x][y]=1;//注意:马本身的位置也被控制 a[0][0]=1;//递推的初始条件 if(g[0][0]==1) a[0][0]=0;//特殊情况,马本身就在起点,则初始的走法就为0 for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){//双重循环 if(g[i][j]==1) a[i][j]=0;//如果改点被马控制,则走法为0 else if(i==0&&j>0)//如果在第一行,并且从第二列开始 a[i][j]=a[i][j-1];//则他的走法等于它左边那个点 else if(j==0&&i>0)//如果在第一列,并且从第二行开始 a[i][j]=a[i-1][j];//它的走法等于他上边的两个点 else if(i>0&&j>0)//其它的点,并且不在第一行和第一列 a[i][j]=a[i-1][j]+a[i][j-1];//则走法等于上边的点+左边的点 } } cout<<a[n][m];//输出结果 return 0; }
-
-1
#include<bits/stdc++.h> long long a,b,f[31][31],c,d,k[31][31]; using namespace std; int main(){ cin>>a>>b>>c>>d; k[c][d]=1; if(c+2<=a&&d-1>=0) k[c+2][d-1]=1; if(c+2<=a&&d+1<=b) k[c+2][d+1]=1; if(c-2>=0&&d+1<=b) k[c-2][d+1]=1; if(c-2>=0&&d-1>=0) k[c-2][d-1]=1; if(c+1<=a&&d-2>=0) k[c+1][d-2]=1; if(c+1<=a&&d+2<=b) k[c+1][d+2]=1; if(c-1>=0&&d-2>=0) k[c-1][d-2]=1; if(c-1>=0&&d+2<=b) k[c-1][d+2]=1; for(int i=0;i<=a;i++){ if(k[i][0]==1) break; else f[i][0]=1; } for(int j=0;j<=b;j++){ if(k[0][j]==1) break; else f[0][j]=1; } for(int i=1;i<=a;i++){ for(int j=1;j<=b;j++){ if(k[i][j]==1) f[i][j]==0; else f[i][j]=f[i-1][j]+f[i][j-1]; }
} cout<<f[a][b]<<endl; return 0;
}
- ~就是简单嘛~ *
-
-3
#include<bits/stdc++.h> using namespace std; typedef long long ull; const int fx[]={0,-2,-1,1,2,2,1,-1,-2}; const int fy[]={0,1,2,2,1,-1,-2,-2,-1}; int bx,by,mx,my; ull f[30][30]; bool s[30][30]; int main() { cin.tie(0); cout.tie(0); cin>>bx>>by>>mx>>my; bx+=2, by+=2,mx+=2,my+=2; f[2][2]=1; for(int i=0;i<=8;i++) s[fx[i]+mx][fy[i]+my]=1; for(int i=2; i<=bx; i++) { for(int j=2;j<=by;j++) { if(s[i][j]==1) continue; f[i][j]=max(f[i][j],f[i-1][j]+f[i][j-1]); } } cout<<f[bx][by]; return 0; }
-
-4
添加了注释
#include<iostream> using namespace std; long B[21][21];//定义棋盘 int main(){ int n,m;//目标点的坐标 int a,b;//马所在点的坐标 cin>>n>>m>>a>>b; //初始化棋盘:假设到达目标点(n,m)前每个点都可以通行设置成1 for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) B[i][j]=1; //将马控制的点设置成0,代表不能通过 //控制马上边的4个点,只要不超过边届,则为控制点 if(a-2>=0&&b-1>=0) B[a-2][b-1]=0; if(a-2>=0&&b+1<=m) B[a-2][b+1]=0; if(a-1>=0&&b-2>=0) B[a-1][b-2]=0; if(a-1>=0&&b+2<=m) B[a-1][b+2]=0; //马下边的4个点,只要不超过边届,则为控制点 if(a+1<=n&&b-2>=0) B[a+1][b-2]=0; if(a+2<=n&&b-1>=0) B[a+2][b-1]=0; if(a+1<=n&&b+2<=m) B[a+1][b+2]=0; if(a+1<=n&&b+1<=m) B[a+2][b+1]=0; //马所在点不能 B[a][b]=0; for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ //如果可行 if(B[i][j]){ if(i==0&&j==0) continue; else if(i==0) B[i][j]=B[i][j-1]; //目标点在最上面一行的时候 else if(j==0) B[i][j]=B[i-1][j];//目标点在最左边一行 else B[i][j]=B[i-1][j]+B[i][j-1];//到达目标点路径=上点路径+左点路径 } } } cout<<B[n][m]<<endl; }
- 1
信息
- ID
- 224
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 5
- 标签
- 递交数
- 102
- 已通过
- 40
- 上传者