1511: 残缺的棋盘
Time Limit: 1 Sec Memory Limit:
128 MB
Submit: 169 Solved: 56
Description
Input
输入包含不超过10000 组数据。每组数据包含6个整数r1, c1, r2, c2, r3, c3 (1<=r1, c1, r2, c2, r3, c3<=8). 三个格子A, B, C保证各不相同。
Output
对于每组数据,输出测试点编号和最少步数。
Sample Input
1 1 8 7 5 6 1 1 3 3 2 2
Sample Output
Case 1: 7 Case 2: 3
HINT
Source
两个多月前不会做的题目现在秒杀了。
#include <stdio.h> #include <queue> #include <algorithm> using namespace std; #include <string.h> #include <stdlib.h> int map[205][205]; int vis[205][205]; int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,-1},{1,1},{-1,1},{-1,-1}};//周围的八个方向跳 int s1,e1,x2,y2; struct node { int x,y; int step; } ; bool check(int x,int y) //检查是否符合条件 { if(x>8 || y>8 ||x<1 ||y<1 ) return 1; if(x==x2 &&y==y2) return 1; if(vis[x][y]) return 1; return 0; } int bfs(int x,int y) { int i; queue<node>q; node st,ed; st.x=x; st.y=y; st.step=0; q.push(st); while(!q.empty()) { st=q.front(); q.pop(); if(st.x==s1 &&st.y==e1) return st.step; // 返回最小步数 for(i=0;i<8;i++) { ed.x=st.x+dir[i][0]; ed.y=st.y+dir[i][1]; if(check(ed.x,ed.y)) continue; ed.step=st.step+1; vis[ed.x][ed.y]=1; q.push(ed); } } } int main() { int s,e,i,j; int Case=0; while(scanf("%d%d%d%d%d%d",&s,&e,&s1,&e1,&x2,&y2)!=EOF) { memset(vis,0,sizeof(vis)); vis[s][e]=1; int ans=bfs(s,e); printf("Case %d: ",++Case); printf("%d\n",ans); } return 0; }
时间: 2024-10-15 22:44:09