华师一附中OI组
标题:
P1443 马的遍历
[打印本页]
作者:
admin
时间:
2018-5-11 10:56
标题:
P1443 马的遍历
https://www.luogu.org/problemnew/show/P1443
题目描述
有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步
输入输出格式
输入格式:
一行四个数据,棋盘的大小和马的坐标
输出格式:
一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)
输入输出样例
输入样例#1:
3 3 1 1
输出样例#1:
0 3 2
3 -1 1
2 1 4
作者:
lyc
时间:
2018-5-12 16:12
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iomanip>
const int maxn=440;
using namespace std;
int n,m;
int qx[100010],qy[100010];
int fx[8]= {2,-2,2,-2,-1,1,-1,1};
int fy[8]= {1,1,-1,-1,2,2,-2,-2};
int map1[maxn][maxn];
int vis[maxn][maxn];
int main()
{
int x;
int y;
cin>>n>>m>>x>>y;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
map1[i][j] = -1;
map1[x][y] = 0;
int st=1, ed=2;
qx[1] = x;
qy[1] = y;
vis[x][y] =1;
while(st != ed)
{
int nowx=qx[st];
int nowy=qy[st];
for(int i=0; i<=7; i++)
{
int xx=nowx+fx[i];
int yy=nowy+fy[i];
if (xx < 1 || xx > n || yy < 1 || yy > m || (map1[xx][yy] <= map1[nowx][nowy] + 1 && map1[xx][yy] + 1))
continue;
map1[xx][yy]=map1[nowx][nowy]+1;
qx[ed] = xx;
qy[ed] = yy;
ed++;
}
st++;
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
cout<<left<<setw(5)<<map1[i][j];
cout<<endl;
}
return 0;
}
复制代码
作者:
liubo
时间:
2018-5-26 22:06
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
const int maxn = 405;
int field[maxn][maxn];
int n,m,sx,sy;
int dx[] = {-1,1,2,2,1,-1,-2,-2};
int dy[] = {-2,-2,-1,1,2,2,1,-1};
struct node{
int x;
int y;
node(int x = 0,int y = 0):x(x),y(y){}
};
queue<node> q;
bool in(node k){
return k.x > 0 && k.x <= n && k.y > 0 && k.y <= m;
}
void bfs(){
while(!q.empty()){
node k = q.front(); q.pop();
for(int i = 0;i <= 7;i++){
node v = node(k.x + dx[i],k.y + dy[i]);
int &m = field[v.x][v.y];
if(in(v) && m == -1){
int n = field[k.x][k.y];
m = n + 1;
q.push(v);
}
}
}
return;
}
int main(){
cin >> n >> m >> sx >> sy;
memset(field,-1,sizeof(field));
field[sx][sy] = 0;
q.push(node(sx,sy));
bfs();
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++)
printf("%-5d",field[i][j]);
printf("\n");
}
return 0;
}
复制代码
写了个bfs
因为场宽的原因卡了两次
使用iomanip中的setw函数要写在后面,但依旧有迷之错误(有时候会只给四格)
无奈改用%-5d
还有就是头文件里如果不写cstdio的话本地可以过编译但洛谷过不了...
作者:
张笑宇
时间:
2018-6-7 23:34
#include<iostream>
#include<iomanip>
using namespace std;
int n,m,x,y,i,j,k;
const int mx=100010;
const int mm=410;
int px[mx],py[mx],a[mm][mm];
int fx[8]= {2,-2,2,-2,-1,1,-1,1};
int fy[8]= {1,1,-1,-1,2,2,-2,-2};
int head,tail;
int main()
{
cin>>n>>m>>x>>y;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++) a[i][j]=-1;
a[x][y]=0;
head=1,tail=2;
px[1]=x,py[1]=y;
while (head!=tail)
{
int nx=px[head];
int ny=py[head];///现在
for (k=0; k<=7; k++)
{
int tx=nx+fx[k];
int ty=ny+fy[k];///下一步
if (tx < 1 || tx > n || ty < 1 || ty > m || (a[tx][ty]<=a[nx][ny]+1&&a[tx][ty]+1))
continue;
a[tx][ty]=a[nx][ny]+1;
px[tail]=tx;
py[tail]=ty;
tail++;
}
head++;
}
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
cout<<left<<setw(5)<<a[i][j];
}
cout<<endl;
}
return 0;
}
复制代码
作者:
胡雨菲菲
时间:
2018-6-8 10:55
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 410;
int m,n,xx,yy, a[N][N], vis[N][N];
int p[N * N][2],top,tail=1;
int dx[8]={-2,-1,1,2,+2,+1,-1,-2};
int dy[8]={+1,+2,2,1,-1,-2,-2,-1};
void bfs(int x,int y)
{
for(int i=0;i<=7;i++)
{
int nowx=x+dx[i];
int nowy=y+dy[i];
if(nowx<1 || nowy<1 || nowx>n || nowy>m) continue;
if(vis[nowx][nowy]) continue;
vis[nowx][nowy]=1;
a[nowx][nowy]=a[x][y]+1;
top++;
p[top][0]=nowx;
p[top][1] = nowy;
}
if(tail>top) return;
tail++;
bfs(p[tail-1][0],p[tail-1][1]);
return;
}
int main()
{
memset (a,-1,sizeof(a));
scanf ("%d%d%d%d",&n,&m,&xx,&yy);
vis[xx][yy]=1;
a[xx][yy]=0;
bfs(xx,yy);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) printf("%-5d",a[i][j]);
printf("\n");
}
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-6-9 19:13
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int m,n,ix,iy;
struct st
{
int step;
int x,y;
} f[410][410];
queue<st>q;
int tx[9]= {0,+1,+1,-1,-1,+2,+2,-2,-2};
int ty[9]= {0,+2,-2,+2,-2,+1,-1,+1,-1};
int main()
{
cin>>m>>n>>ix>>iy;
for(int i=1; i<=m; i++)
for(int j=1; j<=n; j++)
{
f[i][j].step=-1;
f[i][j].x=i;
f[i][j].y=j;
}
f[ix][iy].step=0;q.push(f[ix][iy]);
while(q.size())
{
st t=q.front();
q.pop();
for(int i=1; i<=8; i++)
{
int fx=t.x+tx[i];
int fy=t.y+ty[i];
if(fx>=1&&fx<=m&&fy>=1&&fy<=n&&f[fx][fy].step==-1)
{
f[fx][fy].step=t.step+1;
q.push(f[fx][fy]);
}
}
}
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
printf("%-5d",f[i][j].step);
cout<<endl;
}
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-8-20 11:03
#include<iostream>
#include<iomanip>
using namespace std;
struct node
{
int r,c,step;
} b[100000];
int n,m,a[410][410],mr,mc,dr[8]= {-2,-2,-1,+1,+2,+2,+1,-1},dc[8]= {-1,+1,+2,+2,+1,-1,-2,-2};
int main()
{
cin>>n>>m;
cin>>mr>>mc;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j]=-1;
int head=0,tail=1;
b[head].r=mr;
b[head].c=mc;
b[head].step=0;
a[mr][mc]=0;
while(head<tail)
{
for(int i=0; i<=7; i++)
if(a[b[head].r+dr[i]][b[head].c+dc[i]]==-1 && b[head].r+dr[i]>=1 && b[head].r+dr[i]<=n && b[head].c+dc[i]>=1 && b[head].c+dc[i]<=m)
{
b[tail].r=b[head].r+dr[i];
b[tail].c=b[head].c+dc[i];
b[tail].step=b[head].step+1;
a[b[head].r+dr[i]][b[head].c+dc[i]]=b[tail].step;
tail++;
}
head++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<left<<setw(5)<<a[i][j];///之前提交4、5次全wa,才发现是左对齐输出。。
cout<<endl;
}
return 0;
}
复制代码
作者:
universehyf
时间:
2018-9-1 22:09
//与闻子安一样的情况,特别感谢wza同学的说明,祝百年好合
#include<iostream>
#include<iomanip>
using namespace std;
int s[410][410];
bool b[410][410];
int q[169000][3];
int dx[8]={-2,-1,1,2,2,1,-1,-2},
dy[8]={1,2,2,1,-1,-2,-2,-1};
int n,m,r,c,x,y,head,tail,t=-1;
int main()
{
cin>>n>>m>>r>>c;
head=0;tail=1;
q[1][1]=r;q[1][2]=c;q[1][3]=0;
b[r][c]=1;s[r][c]=0;
do
{
head++;x=q[head][1];y=q[head][2];
for(int i=0;i<=7;i++)
if(x+dx[i]>=1&&x+dx[i]<=n&&y+dy[i]>=1&&y+dy[i]<=m&&(!b[x+dx[i]][y+dy[i]]))
{
tail++;b[x+dx[i]][y+dy[i]]=1;
q[tail][1]=x+dx[i];q[tail][2]=y+dy[i];q[tail][3]=q[head][3]+1;
s[q[tail][1]][q[tail][2]]=q[tail][3];
}
}while(head<tail);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(b[i][j]) cout<<left<<setw(5)<<s[i][j];
else cout<<left<<setw(5)<<t;
}
if(i!=n) cout<<endl;
}
return 0;
}
复制代码
作者:
type尧
时间:
2018-11-4 18:54
//
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<iomanip>
#define maxn 201
using namespace std;
typedef int h;
h martix[maxn][maxn];
h n,m,move[8][2]={{-2,+1},{-1,+2},{+1,+2},{+2,+1},{+2,-1},{+1,-2},{-1,-2},{-2,-1}};
struct point{
h x,y,n;
}p;
queue<point> q;
void getdata()
{
cin>>n>>m;
for(h i=1;i<=n;i++)
for(h j=1;j<=m;j++)
martix[i][j]=-1;
cin>>p.x>>p.y;
return;
}
void bfs()
{
martix[p.x][p.y]=0;
q.push(p);
while(!q.empty()){
point temp;
for(h i=0;i<8;i++){
temp=q.front();
h x=temp.x+move[i][0];
h y=temp.y+move[i][1];
if(x<1||x>n||y<1||y>m||martix[x][y]!=-1) continue;
temp.x+=move[i][0];
temp.y+=move[i][1];
temp.n++;
q.push(temp);
martix[temp.x][temp.y]=temp.n;
}
q.pop();
}
return;
}
void print()
{
for(h i=1;i<=n;i++){
for(h j=1;j<=m;j++)
cout<<setiosflags(ios::left)<<setw(5)<<martix[i][j];
cout<<endl;
}
}
h main()
{
getdata();
bfs();
print();
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2