• POJ 2488 A Knight's Journey【DFS + 回溯应用】


    原题链接:http://poj.org/problem?id=2488

    我的链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=19651#problem/A

    A Knight's Journey
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 23452   Accepted: 7944

    Description

    Background 
    The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey 
    around the world. Whenever a knight moves, it is two squares in one direction and one square perpendicular to this. The world of a knight is the chessboard he is living on. Our knight lives on a chessboard that has a smaller area than a regular 8 * 8 board, but it is still rectangular. Can you help this adventurous knight to make travel plans? 

    Problem 
    Find a path such that the knight visits every square once. The knight can start and end on any square of the board.

    Input

    The input begins with a positive integer n in the first line. The following lines contain n test cases. Each test case consists of a single line with two positive integers p and q, such that 1 <= p * q <= 26. This represents a p * q chessboard, where p describes how many different square numbers 1, . . . , p exist, q describes how many different square letters exist. These are the first q letters of the Latin alphabet: A, . . .

    Output

    The output for every scenario begins with a line containing "Scenario #i:", where i is the number of the scenario starting at 1. Then print a single line containing the lexicographically first path that visits all squares of the chessboard with knight moves followed by an empty line. The path should be given on a single line by concatenating the names of the visited squares. Each square name consists of a capital letter followed by a number. 
    If no such path exist, you should output impossible on a single line.

    Sample Input

    3
    1 1
    2 3
    4 3

    Sample Output

    Scenario #1:
    A1
    
    Scenario #2:
    impossible
    
    Scenario #3:
    A1B3C1A2B4C2A3B1C3A4B2C4
    

    Source

    TUD Programming Contest 2005, Darmstadt, Germany

    算法:DFS + 回溯

    题意:骑士周游列国问题,说白了就是任一给你一个棋盘(当然满足格子数小于26

                让你从第一个格子按照图中所给的马走日的步法

                不重复遍历走完整个棋盘。然后按照字典序输出路径即可

    思路:按照图中的八个方向dfs即可。

    注意: 1.回溯的用法,千万别忘了还原状态。

             2.路径的输出,字典序的是列。。。

    //Accepted	172 KB	16 ms	C++	1191 B	2013-03-02 21:12:01
    #include<cstdio>
    #include<cstring>
    
    const int maxn = 30;
    
    int w[maxn*maxn][2]; //存储路径 
    bool vis[maxn][maxn];
    int dir[8][2] = {-2,-1, -2,1, -1,-2, -1,2, 1,-2, 1,2, 2,-1, 2,1};
    
    int p,q;
    int n;
    int sum;
    
    bool search(int row, int col)
    {
    	sum++;
    	w[sum][0] = row; w[sum][1] = col;
    	if(sum == n) return true;
    	
    	else for(int i = 0; i < 8; i++)
    	{
    		int next_r = row + dir[i][0];
    		int next_c = col + dir[i][1];
    		
    		if(next_r >= 1 && next_r <= q && next_c >= 1 && next_c <= p && !vis[next_r][next_c])
    		{ //注意行和列的范围 
    			vis[next_r][next_c] = true;  
    			if(search(next_r, next_c)) return true; //
    			vis[next_r][next_c] = false; 
    			sum--;  //注意点 开始WA了好久 
    		} 
    	}
    	return false;
    }
    int main()
    {
    	int T;
    	scanf("%d", &T);
    	for(int test = 1; test <= T; test++)
    	{
    		bool result = false;
    		scanf("%d%d", &p, &q);
    		
    		n = p*q; sum = 0;
    		if(n >= 1 && n <= 26)
    		{
    			memset(w,0,sizeof(w));
    			memset(vis,false,sizeof(vis));
    			
    			vis[1][1] = true;
    			 
    			result = search(1,1);
    			
    			printf("Scenario #%d:\n", test);
    			if(result)
    			{
    				for(int i = 1; i <= n; i++)
    					printf("%c%d", w[i][0]+'A'-1, w[i][1]);
    				printf("\n");
    			}
    			else
    			{
    				printf("impossible\n");
    			}
    			 
    			if(test != T) printf("\n"); //注意格式 
    		}
    	}
    	return 0;
    }





  • 相关阅读:
    AptitudeSystem 2.0
    angularjs开发常见问题-2(angularjs内置过滤器)
    经常使用 Java API
    Spring Boot JPA 连接数据库
    机房收费系统个人重构版:软工文档中那些图
    Android
    Spring Boot 动态数据源(多数据源自己主动切换)
    java的nio包的SelectionKey,Selector,SelectableChannel三者的缠绵关系概述
    初探linux子系统集之timer子系统(三)
    mobiscroll 案例git
  • 原文地址:https://www.cnblogs.com/freezhan/p/2950432.html
Copyright © 2020-2023  润新知