• poj_2488A Knight's Journey


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

    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
    
    
    
    
    
    
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int MAXN = 30;
    int m,n;
    const int moves[8][2] = {-1, -2, 1, -2, -2, -1, 2, -1, -2, 1, 2, 1, -1, 2, 1, 2};
    bool visited[MAXN][MAXN];
    char path[MAXN][2];
    bool flag;
    
    bool DFS(int x, int y,int setp)
    {
    	if(m * n == setp)
    	{
    		flag = true;
    		return true;
    	}
    	for(int i=0;i<8;i++)
    	{
    		int p = x + moves[i][0];
    		int q = y + moves[i][1];
    		if(p>=1&&p<=m&&q>=1&&q<=n&&!visited[p][q])
    		{
    			path[setp][0] = p + 'A' - 1;
    			path[setp][1] = q + '0';
    			visited[p][q] = true;
    			DFS(p,q,setp+1);
    			if(flag) return true;
    			visited[p][q] = false;
    		}
    	}
    	return false;
    }
    
    
    int main()
    {
    	freopen("in.txt","r",stdin);
    	int t,i,j;
    	cin>>t;
    	for(i=1;i<=t;i++)
    	{
    		cin>>n>>m;
    		memset(visited,false,sizeof(visited));
    		memset(path,0,sizeof(path));
    
    		flag = false;
    		path[0][0] = 'A';
    		path[0][1] = '1';
    		visited[1][1] = true;
    
    		printf("Scenario #%d:\n",i);
    		if(DFS(1,1,1))
    		{
    			for(j=0;j<n*m;j++)
    				printf("%c%c",path[j][0],path[j][1]);
    		}
    		else 
    			printf("impossible");
    		printf("\n\n");
    		
    	}
    	return 0;
    }
    


  • 相关阅读:
    阻塞队列(BlockingQueue)
    CountDownLatch/CyclicBarrier/Semaphore
    Guava Cache详解
    Java中的常见锁(公平和非公平锁、可重入锁和不可重入锁、自旋锁、独占锁和共享锁)
    CopyOnWriteArrayList详解
    集合类线程安全问题
    原子类的 ABA 问题
    原子类CAS的底层实现
    volatile关键字
    Java 内存模型(Java Memory Model,JMM)
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835331.html
Copyright © 2020-2023  润新知