3 条题解
-
4
史上最
强长代码:#include <bits/stdc++.h> using namespace std; int main() { cout << "1:0,0->2,1->4,2->3,4->4,6->2,7->4,8\n2:0,0->2,1->4,2->3,4->1,5->3,6->4,8\n3:0,0->2,1->4,2->3,4->1,5->2,7->4,8\n4:0,0->2,1->4,2->2,3->4,4->3,6->4,8\n5:0,0->2,1->4,2->2,3->4,4->2,5->4,6->2,7->4,8\n6:0,0->2,1->4,2->2,3->4,4->2,5->0,6->2,7->4,8\n7:0,0->2,1->4,2->2,3->3,5->2,7->4,8\n8:0,0->2,1->4,2->2,3->1,5->3,6->4,8\n9:0,0->2,1->4,2->2,3->1,5->2,7->4,8\n10:0,0->2,1->4,2->2,3->0,4->2,5->4,6->2,7->4,8\n11:0,0->2,1->4,2->2,3->0,4->2,5->0,6->2,7->4,8\n12:0,0->2,1->3,3->2,5->4,6->2,7->4,8\n13:0,0->2,1->3,3->2,5->0,6->2,7->4,8\n14:0,0->2,1->3,3->1,4->3,5->2,7->4,8\n15:0,0->2,1->3,3->1,4->0,6->2,7->4,8\n16:0,0->2,1->1,3->3,4->4,6->2,7->4,8\n17:0,0->2,1->1,3->3,4->1,5->3,6->4,8\n18:0,0->2,1->1,3->3,4->1,5->2,7->4,8\n19:0,0->2,1->1,3->2,5->4,6->2,7->4,8\n20:0,0->2,1->1,3->2,5->0,6->2,7->4,8\n21:0,0->2,1->0,2->2,3->4,4->3,6->4,8\n22:0,0->2,1->0,2->2,3->4,4->2,5->4,6->2,7->4,8\n23:0,0->2,1->0,2->2,3->4,4->2,5->0,6->2,7->4,8\n24:0,0->2,1->0,2->2,3->3,5->2,7->4,8\n25:0,0->2,1->0,2->2,3->1,5->3,6->4,8\n26:0,0->2,1->0,2->2,3->1,5->2,7->4,8\n27:0,0->2,1->0,2->2,3->0,4->2,5->4,6->2,7->4,8\n28:0,0->2,1->0,2->2,3->0,4->2,5->0,6->2,7->4,8\n29:0,0->2,1->0,2->1,4->3,5->2,7->4,8\n30:0,0->2,1->0,2->1,4->0,6->2,7->4,8\n31:0,0->1,2->3,3->2,5->4,6->2,7->4,8\n32:0,0->1,2->3,3->2,5->0,6->2,7->4,8\n33:0,0->1,2->3,3->1,4->3,5->2,7->4,8\n34:0,0->1,2->3,3->1,4->0,6->2,7->4,8\n35:0,0->1,2->2,4->3,6->4,8\n36:0,0->1,2->0,4->2,5->4,6->2,7->4,8\n37:0,0->1,2->0,4->2,5->0,6->2,7->4,8"; return 0; }
-
1
#include<iostream> using namespace std; int n,m,sum; struct data{ int p,q; }a[110]; int dx[4]={2,1,-1,-2}; int dy[4]={1,2,2,1}; int g[110][110]; void dfs(int x,int y,int u) { if(x==4&&y==8) { a[u].p=x; a[u].q=y; sum++; cout<<sum<<":"<<a[1].p<<","<<a[1].q; for(int i=2;i<=u;i++) cout<<"->"<<a[i].p<<","<<a[i].q; cout<<endl; return ; } a[u].p=x; a[u].q=y; g[x][y]=1; for(int i=0;i<4;i++) { int xx=x+dx[i],yy=y+dy[i]; if(xx>=0&&yy>=0&&xx<=4&&yy<=8&&!g[xx][yy]) { dfs(xx,yy,u+1); g[x][y]=0; } } } int main(){ dfs(0,0,1); return 0; } /* bfs是一层层开始扫荡 dfs是一条道走到黑 求方案数,走完了一条返回接着走 dfs的参数一定要确定好 */
方法2
#include<bits/stdc++.h> using namespace std; int n,m,cnt=1; int a[2][10]; void dfs(int x,int y,int len,int a[][10]){ a[0][len]=x; a[1][len]=y; if(x>n||y>m||x<0||y<0) return; else if(x==n&&y==m){ cout<<cnt<<":"; cnt++; for(int i=0;i<=len;i++){ if(i==len) printf("%d,%d\n",a[0][i],a[1][i]); else printf("%d,%d->",a[0][i],a[1][i]); } return; } dfs(x+2,y+1,len+1,a); dfs(x+1,y+2,len+1,a); dfs(x-1,y+2,len+1,a); dfs(x-2,y+1,len+1,a); } int main() { //cin>>n>>m; n=4,m=8; dfs(0,0,0,a); return 0; }
-
0
这道题本是一道简简单单的深搜,但是这道题的图去哪了?我咋没看到??
好吧,没图也没关系。题目中说从左下角往右上角跳,只能向右跳,顺时针顺序。那我们把它转化成:从左上角向右下角跳,只能向右跳,逆时针顺序。这下就好解决了。最后用一个数组记录路径即可。
核心代码:
int cnt,path[50][2];//path[i][0]表示第i步的行号,path[i][1]表示第i步的列号 bool vis[5][9]; const int dx[]={2,1,-1,-2}; const int dy[]={1,2,2,1}; void dfs(int x,int y,int d){ path[d][0]=x,path[d][1]=y; if (x==4&&y==8){ cnt++; printf("%d:",cnt); for (int i=1;i<d;i++){ printf("%d,%d->",path[i][0],path[i][1]); } printf("%d,%d\n",path[d][0],path[d][1]); return; } vis[x][y]=1; for (int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if (nx>=0&&nx<=4&&ny<=8&&!vis[nx][ny]){ dfs(nx,ny,d+1); } } vis[x][y]=0; }
- 1
信息
- ID
- 359
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 2
- 标签
- 递交数
- 118
- 已通过
- 70
- 上传者