解题思路:通过dfs填写最方便 详解请看代码
注意事项:1、向下和向右都能走时要向右走,需要特判
2、for循环找方向时要按照下左上右的顺序
3、每行最后一个元素后没有空格
参考代码:
#include<iostream> using namespace std; const int N=110; int a[N][N],n; int dx[4]={1,0,-1,0},dy[4]={0,-1,0,1}; //方向按照下左上右 bool find(int xx,int yx) //判断能不能走 { if(a[xx][yx]==0&&xx>0&&yx>0&&xx<=n&&yx<=n) //没走过并且没出界 return true; return false; } void dfs(int x,int y,int t) { a[x][y]=t; // 给数组相应位置赋值 if(t==n*n) // 最后一个数为n*n,结束 return ; if(find(x+1,y)&&find(x,y+1)) //如果向右向下都能走 则向右走 dfs(x,y+1,t+1); for(int i=0;i<4;i++) { int xx=x+dx[i],yx=y+dy[i]; if(find(xx,yx)) dfs(xx,yx,t+1); } } int main(void) { while(cin>>n){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=0; //初始化数组为0 dfs(1,n,1); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) if(j==n) cout<<a[i][j]<<endl; //最后一个元素输出换行 else cout<<a[i][j]<<' '; } cout<<endl;} return 0; }
0.0分
1 人评分