1 条题解

  • 0
    @ 2025-10-10 19:24:13

    C++ :

    #include <bits/stdc++.h> 
    using namespace std; 
    int a[50][50];//存放所有走过的路径 
    bool f[50][50];//标记某个点是否走过 
    int n,c;//n行,m列的棋盘 
      
    //fx代表x坐标可能的变化 
    //四个方向:下、右、上、左 
    int fx[4] = {0,1,0,-1}; 
    //fy代表y坐标可能的变化 
    int fy[4] = {1,0,-1,0}; 
      
    //x代表a数组中元素的个数 
    void print(int x){ 
    	c++; 
    	cout<<c<<":"; 
    	int i; 
    	for(i = 1;i <= x;i++){ 
    		//如果不是最后一个解 
    		if(i != x){ 
    			cout<<a[i][1]<<","<<a[i][2]<<"->"; 
    		}else{ 
    			cout<<a[i][1]<<","<<a[i][2]<<endl; 
    		} 
    	} 
    	 
    } 
      
      
    //k代表向二维数组a中填值的下标 
    void fun(int k){ 
    	//dx,dy代表准备走的点的坐标 
    	int i,dx,dy; 
    	//循环所有可能的解 
    	for(i = 0;i < 4;i++){ 
    		//准备走的点:在上一个点的坐标上向下或者向右 
    		dx = a[k-1][1] + fx[i]; 
    		dy = a[k-1][2] + fy[i]; 
    		 
    		//判断新坐标的正确性(在棋盘内,且没走过) 
    		if(dx <= n && dy <= n && dx >= 1 && dy >= 1 && f[dx][dy] == false){ 
    			//标记该点走过 
    			f[dx][dy] = true; 
    			  
    			//存储该点的坐标 
    			a[k][1] = dx; 
    			a[k][2] = dy; 
    			 
    			//如果到了目的地 
    			if(dx == n && dy == n){ 
    				print(k); 
    			}else{ 
    				fun(k+1); 
    			} 
    			 
    			//回溯:重新标记该点没有走过 
    			f[dx][dy] = false; 
    		} 
    	} 
    } 
      
    int main(){ 
    	cin>>n;
    	//a数组从下标为1开始存储 
    	a[1][1] = 1; 
    	a[1][2] = 1; 
    	f[1][1] = true;//1,1点标记为走过了 
    	fun(2);	 
    } 
    
    
    • 1

    信息

    ID
    659
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者