cf#94-div1-A. Statues

102 篇文章 0 订阅
49 篇文章 1 订阅

http://codeforces.com/problemset/problem/128/A

题意:

给8x8棋盘,右上角是A,左下角是M

其余是点.或者是S

A不动,M每次可以朝着8个方向走,或不动。。。

每次A走一步后,所有的S都会往下移动一格(直到掉出棋盘)

问你M能否到达A,能输出win否则输出yes(走的过程如果碰到S会死,只能走空点)

开始时M先走


。。。。只有8X8嘛,显然8步之后,所有S都掉出棋盘了啊,只需要让M跑八步还不死就得了。。。

然后是每次S往下掉一格,也就是地图会变化

因为我们只需要枚举前7步,我们把0-7步的地图都预处理出来,

然后跑个bfs,看M能否在走了7步之后仍活下来(没碰到S)

。。。

卡了半天。。。原来是判断停在原地的情况时,少了一个if,也就是 if (格子==‘M’)也OK的情况.......跪啊,这么sb的错误。。。。。。。每次写搜索都犯sb错误


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001; 

char mp[20][20];
char ans[15][20][20];
struct node
{
	int x,y;
	int step;
	node(int a=0,int b=0)
	{x=a,y=b;step=0;}
	node(int a,int b,int c)
	{x=a,y=b;step=c;}
};

node ss[8*8+10];
int ok=0;
void change()
{
	int i;
	for (i=ok;i>=1;i--)
	{
		int x=ss[i].x;
		int y=ss[i].y;
		if (x>8)continue;
		mp[x][y]='.'; 
			ss[i].x=x+1;
		if (x+1<=8)
		{
			mp[x+1][y]='S';
		}
	}
}
queue<node >sb;
int dx[]={0,0,-1,-1,-1,1,1,1,0};
int dy[]={1,-1,0,1,-1,0,1,-1,0};
int vis[20][20];
int main()
{ 
	int n;
	int i,j,k;
	for (i=1;i<=8;i++)
		scanf("%s",mp[i]+1);
	for (i=1;i<=8;i++)
	{
		for (j=1;j<=8;j++)
		{
			if (mp[i][j]=='S')
				ss[++ok]=node(i,j);
		}
	}
	
	for (k=0;k<=9;k++)
	{
		for (i=1;i<=8;i++)
		{
			for (j=1;j<=8;j++)
			{
				ans[k][i][j]=mp[i][j];
			}
		}
		change(); 
	}
	int flag=0;
	sb.push(node(8,1));
	while(!sb.empty())
	{
		node tt=sb.front();
		sb.pop();
		if (ans[tt.step][tt.x][tt.y]=='S')continue;
		if (tt.step>=7) 
		{flag=1;break;}
		
		for (i=0;i<9;i++)
		{
			int xx=tt.x+dx[i];
			int yy=tt.y+dy[i];
			if (xx>=1&&xx<=8&&yy>=1&&yy<=8)
		//		if (vis[xx][yy]==0) 
			if (ans[tt.step][xx][yy]=='.'||ans[tt.step][xx][yy]=='M')
			{ 
			 	sb.push(node(xx,yy,tt.step+1));
			//	vis[xx][yy]=1;
			}
		}
	}
if (flag)
printf("WIN\n");
else
printf("LOSE\n");
	
	
	return 0;
	
}


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001; 

__int64 max(__int64 a,__int64 b)
{return a>b?a:b;} 

int dx[]={0,0,0,1,1,1,-1,-1,-1};
int dy[]={0,1,-1,0,1,-1,0,1,-1};
char tm[10][10];
char after[10][10][10];
void change()
{
	int j,k;
	for (j=8;j>=1;j--)
	{
		for (k=1;k<=8;k++)
		{
			if (tm[j][k]=='S')
			{
				tm[j][k]='.';
				if (j!=8) tm[j+1][k]='S'; 
			}
		}
	}
}
struct node
{
	int x,y,step;
	node(){}
		node(int a,int b,int c=0){x=a,y=b;step=c;}
};
int vis[10][10][10];
queue<node> q;
int main()
{ 
	int i,j,k;
	for (i=1;i<=8;i++)
		scanf("%s",tm[i]+1);
	for (j=1;j<=8;j++)
		{
			for (k=1;k<=8;k++)
				after[0][j][k]=tm[j][k];
	} 
	for (i=1;i<=7;i++)
	{
		change();
		for (j=1;j<=8;j++)
		{
			for (k=1;k<=8;k++)
				after[i][j][k]=tm[j][k];
		}
	}

	node st(8,1,0);
	q.push(st);
	int step=1;
	int flag=0;
	while(!q.empty())
	{
		node tt=q.front();
		q.pop();
		if (after[tt.step][tt.x][tt.y]=='S') continue;
		if (tt.step==8)
		{
			flag=1;
		 	break;
		}
		for (i=0;i<9;i++)
		{
			int tx=tt.x+dx[i];
			int ty=tt.y+dy[i];
			if (!(tx>=1&&tx<=8&&ty>=1&&ty<=8))continue;
			if (after[tt.step][tx][ty]=='S') continue;
			if (vis[tt.step+1][tx][ty])continue;
			vis[tt.step+1][tx][ty]=1;
			q.push(node(tx,ty,tt.step+1));
		}
	}

	if (flag)
		printf("WIN\n");
	else
		printf("LOSE\n");
	
	return 0;
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值