UVa439——骑士的移动

简单bfs

 1 #include <iostream>
 2 #include <cstring>
 3 #include <string>
 4 #include <map>
 5 #include <set>
 6 #include <algorithm>
 7 #include <fstream>
 8 #include <cstdio>
 9 #include <cmath>
10 #include <stack>
11 #include <queue>
12 using namespace std;
13 const double Pi=3.14159265358979323846;
14 typedef long long ll;
15 const int MAXN=5000+5;
16 int dx[8]={-1,-1,-2,-2,1,1,2,2};
17 int dy[8]={-2,2,-1,1,-2,2,-1,1};
18 const int INF = 0x3f3f3f3f;
19 const int NINF = 0xc0c0c0c0;
20 const ll mod=1e9+7;
21 int M[9][9];
22 struct node{
23     int x;int y;int step;
24     node (int x=0,int y=0,int step=0)
25     {
26         this->x=x;
27         this->y=y;
28         this->step=step;
29     }
30 }now,tim;
31
32 int bfs(int x1,int y1,int x2,int y2,string str1,string str2)
33 {
34
35     tim.x=x1;tim.y=y1;tim.step=0;
36     queue <node> Q;
37     Q.push(tim);
38     //cout <<x2<<" "<<y2<<endl;
39     while(!Q.empty())
40     {
41
42         tim=Q.front();Q.pop();
43         if(tim.x==x2&&tim.y==y2)
44         {
45             cout <<"To get from "<<str1<<" to "<<str2<<" takes "<<M[tim.x][tim.y]<<" knight moves.\n";
46             return 0;
47         }
48         for(int i=0;i<8;i++)
49         {
50             now.x=tim.x+dx[i];
51             now.y=tim.y+dy[i];
52             if(now.x>=1&&now.y<=8&&now.x<=8&&now.y>=1&&M[now.x][now.y]==-1)
53             {
54                 now.step=tim.step+1;
55                 M[now.x][now.y]=M[tim.x][tim.y]+1;
56                 Q.push(now);
57             }
58         }
59     }
60     return -1;
61 }
62
63 int main()
64 {
65     string str1,str2;
66     while(cin>>str1)
67     {
68         cin>>str2;
69         int x1,x2,y1,y2;
70         memset(M,-1,sizeof(M));
71         x1=9-str1[1]+‘0‘;
72         y1=str1[0]-‘a‘+1;
73         y2=str2[0]-‘a‘+1;
74         x2=9-str2[1]+‘0‘;
75         M[x1][y1]=0;
76         //cout <<x1<<y1<<x2<<y2<<endl;
77         bfs(x1,y1,x2,y2,str1,str2);
78     }
79     return 0;
80 }

原文地址:https://www.cnblogs.com/Msmw/p/10731685.html

时间: 2024-10-25 08:08:56

UVa439——骑士的移动的相关文章

UVa439

Knight Moves 题意:骑士巡游到某位置的最少步数 #include <stdio.h> #include <string.h> int s[20][20]; int rear, front; int min; char a, c; int b, d; struct { int x, y; int p; }Susake[300000]; void bfs(int n, int m) { int t; rear++; Susake[rear].x = n; Susake[re

[COGS746] [网络流24题] 骑士共存

★★☆   输入文件:knight.in   输出文件:knight.out   简单对比 时间限制:1 s   内存限制:128 MB 骑士共存问题 «问题描述: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务: 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑 士,使得它们彼此互不攻击. «数据输入: 由文件knight.in给出输入数据.第一行有2 个正整数n 和m (1<=n<

【Codevs1922】骑士共存问题(最小割,二分图最大匹配)

题意: 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以放置多少个骑士,使得它们彼此互不攻击. n<=200,m<=n^2 思路:经典的二分图最大匹配问题,采用黑白点染色的思想. 如果按照相邻点黑白不同染色,可以发现每次跳到的点必定与现在所在点不同色,二分图最大匹配即可. 这里用最小割来解决,因为不能允许任何黑白点之间的任何一条边有流量,符合最小割的思想. 1

【树形DP】BZOJ1040-[ZJOI2008]骑士

[题目大意] 有n个骑士,给出他们的能力值和最痛恨的一位骑士.选出一个骑士军团,使得军团内没有矛盾的两人(不存在一个骑士与他最痛恨的人一同被选入骑士军团的情况),并且,使得这支骑士军团最具有战斗力,求战斗力的最大值. [思路] 首先yy一下,可以知道这是一个基环森林.我们可以用以下方法: 首先在每一棵基环树的环上任意找到一条边(用dfs来实现),记它的两个端点为u和v.然后删掉这条边(我这里用的方法是记录u,v在对方容器中的位置,并在后续操作中忽略这条边).由于u和v不能同时取,在删掉u和v之间

bzoj1040 骑士

Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在和平环境中安逸了数百年的Z国又怎能抵挡的住Y国的军队.于是人们把所有的希望都寄托在了骑士团的身上,就像期待有一个真龙天子的降生,带领正义打败邪恶.骑士团是肯定具有打败邪恶势力的能力的,但是骑士们互相之间往往有一些矛盾.每个骑士都有且仅有一个自己最厌恶的骑士(当然不是他自己),他是绝对不

骑士飞行棋第三版(上色)

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 骑士飞行棋 8 { 9 class Program 10 { 11 12 //在下面的数组存储我们游戏地图各个关卡 13 //数组的小标为0的元素对应地图上的第一格 下标为1的元素对应第二格...下标为n的元素对应n+1

BZOJ 1040: [ZJOI2008]骑士( 树形dp )

这是一个森林中, 每棵树上都有一个环...每棵树单独处理, 找出环上任意一条边断开, 限制一下这条边两端点的情况, 然后就可以树dp了.. ------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace

Ni骑士(ni)

搞了半天八数码弄不出来就只好来打题解  这道题是在搜索a碰到的(链接: http://pan.baidu.com/s/1jG9rQsQ ) 感觉题目最大亮点就是这英文简写"ni", 真是令人感慨出题老师的才华啊  好了,废话不多说  题目内容如下(闲烦请无视之,下下方有简单的介绍): [问题描述] 贝 西(Bessie)在卡摩洛遇到了棘手的情况:她必须穿越由Ni骑士把守的森林. 骑士答应Bessie只要 Bessie 能给他们带来一丛灌木就能安全穿越森林.时间宝贵,Bessie 必须尽

骑士走棋盘

问题陈述: 骑士游历(Knight tour)在十八世纪初备受数学家与拼图迷的注意,究竟它是什么时候被提出已不可考.骑士的走法为国际象棋的走法,类似中国象棋的马,骑士可以由任意一个位置出发,他如何走完所有的位置? 问题解法: 骑士的走法,基本上可以用递归的方法来解决,但是纯粹的递归在维度大时相当没有效率.一个聪明的解法由J.C.Warnsdorff在1823年提出,简单的说,先将最难的位置走完,接下来的路就是宽广,骑士所要走的下一步:为下一步再做选择时,所能走的步数最少的一步.使用这个方法,在不