标签:else org 一个 written 技术分享 com href 需要 show
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 26844 | Accepted: 12663 |
Description
Input
Output
Sample Input
3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1
Sample Output
5 28 0
Source
初始化队列Q. Q={起点s};
标记s为己访问;
while (Q非空)
{
取Q队首元素u; u出队; if (u == 目标状态)
{…}
所有与u相邻且未被访问的点进入队列; 标记u为已访问;
}
用bfs从起始点每次遍历八个方向到终点结束,详见代码。
#include<iostream> #include<cstdio> #include<algorithm> #include<math.h> #include<queue> #include<cstring> using namespace std; int n,sx,sy,tx,ty; int m[305][305]; struct pos//定义一个结构体包含坐标和步数 { int x; int y; int num; }; int d[8][2]={-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2,-2,-1};//knight可以走八个方向 void bfs(int x,int y) { pos a,b; queue<pos> q; a.x=x; a.y=y; a.num=0; memset(m,0,sizeof(m)); m[a.x][a.y]=1;//把起始点标记为走过,记为1 q.push(a);//起点入队 while(!q.empty())//当队列不为空 { a=q.front();//取队列中第一个元素 q.pop();//当前第一个元素出队 if(a.x==tx&&a.y==ty)//如果到终点了 输出步数 { cout<<a.num<<endl; return; } for(int i=0;i<8;i++)//遍历8个方向 { if(a.x+d[i][0]>=0&&a.x+d[i][0]<n&&a.y+d[i][1]>=0&&a.y+d[i][1]<n&&!m[a.x+d[i][0]][a.y+d[i][1]])//判断是否越界和是否走过 { b.x=a.x+d[i][0];//下一个节点的x坐标 b.y=a.y+d[i][1];//下一个节点的y坐标 b.num=a.num+1;//步数+1 m[b.x][b.y]=1;//标记走过 q.push(b);//扩展的新节点入队 } } } } int main() { int T; cin>>T; while(T--) { cin>>n; cin>>sx>>sy; cin>>tx>>ty; bfs(sx,sy); } return 0; }
标签:else org 一个 written 技术分享 com href 需要 show
原文地址:http://www.cnblogs.com/FTA-Macro/p/7266311.html