POJ - 2488 A Knight's Journey

来源:互联网 发布:linux源码编译mysql 编辑:程序博客网 时间:2024/05/29 18:54

1.题面

http://poj.org/problem?id=2488

2.题意

搜,搜,搜,搜,搜,按最小字典序搜

3.思路

注意最小字典序

4.代码

/*****************************************************************    > File Name: cpp_acm.cpp    > Author: Uncle_Sugar    > Mail: uncle_sugar@qq.com    > Created Time: Wed 10 Aug 2016 19:07:02 CST*****************************************************************/# include <cstdio># include <cstring># include <cctype># include <cmath># include <cstdlib># include <climits># include <iostream># include <iomanip># include <set># include <map># include <vector># include <stack># include <queue># include <algorithm>using namespace std;# define rep(i,a,b) for (i=a;i<=b;i++)# define rrep(i,a,b) for (i=b;i>=a;i--)template<class T>void PrintArray(T* first, T* last, char delim=' '){    for (;first!=last;first++) cout << *first << (first+1==last?'\n':delim);}const int debug = 1;const int size  = 26 + 10 ; const int INF = INT_MAX>>1;typedef long long ll;typedef pair<int,int> pir;/*1.see the size of the input data before you select your algorithm 2.cin&cout is not recommended in ACM/ICPC3.pay attention to the size you defined, for instance the size of edge is double the size of vertex*/int n,m;int vis[size][size];int dx[8] = {-1,1,-2,2,-2,2,-1,1};int dy[8] = {-2,-2,-1,-1,1,1,2,2};bool flag = false;vector<pir> ans;vector<pir> path;bool inrange(int x, int y){return x>=0&&x<n&&y>=0&&y<m;}void dfs(int x,int y,int cnt){if (cnt==m*n){flag = true;ans = path;return;}for (int i=0;i<8&&flag==false;i++){int nx = x + dx[i];int ny = y + dy[i];if (inrange(nx,ny)&&!vis[nx][ny]){vis[nx][ny] = 1;path.push_back(pir(nx,ny));dfs(nx, ny, cnt+1);path.pop_back();vis[nx][ny] = 0;}}}int main(){/*std::ios::sync_with_stdio(false);cin.tie(0);*/int i,j;int T;scanf("%d",&T);int ncase = 0;while (T--){ans.clear(); path.clear();memset(vis,0,sizeof(vis));flag = false;scanf("%d%d",&n,&m);path.push_back(pir(0,0));vis[0][0] = 1;dfs(0,0,1);printf("Scenario #%d:\n",++ncase);if (flag){for (i=0;i<ans.size();i++){int x = ans[i].first;int y = ans[i].second;printf("%c%d",y+'A',x+1);}printf("\n");}else {printf("impossible\n");}printf("\n");}return 0;}


0 0
原创粉丝点击