社区讨论

求救!!!大佬求救!!!为啥样例过了但是全WA

P2445[SDOI2005] 动物园参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo0uovn0
此快照首次捕获于
2023/10/22 10:29
2 年前
此快照最后确认于
2023/11/02 12:11
2 年前
查看原帖
思路就是从已经给出的目击到的点出发,找到每个相应步数搜索别的点,如果搜到了就标上。剩下的没有被目击的点以及没有标上的点就一一对应,最后一起输出。样例是对的,但是没别的样例了,这为啥全WA呢?(居然没超时,我不理解)
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,r,okk;
char ma[110][110];
int v[110],cage_x[110],cage_y[110];
int td[110],tx[110],ty[110];
int mx[4]={0,0,1,-1};
int my[4]={1,-1,0,0}; 
int ok[110][110];
class ANSWER {
	public:
		int i,x,y;
};
int remain_animal[110],remain,ok_cage[110];
map <int, ANSWER> ans;
inline int ABS (int a)
{
	if (a>0) return a;
	return -a;
}
void dfs1 (int now_x,int now_y,int step,int n_animal,int n_cage)
{
//	cout<<now_x<<" "<<now_y<<" "<<step<<endl;
	if (okk==1) return ;
	if (step==td[n_animal]) {
		if (now_x==cage_x[n_cage] && now_y==cage_y[n_cage]) {
			okk=1;
			ans[n_animal].x=now_x;
			ans[n_animal].y=now_y;
			ok_cage[n_cage]=1;
			return ;
		}
	}
	if (ABS(now_x-cage_x[n_cage])+ABS(now_y-cage_y[n_cage]) > td[n_animal]-step+v[n_animal]) return ; // 剪枝,曼哈顿距离 
	for (int i=0;i<4;i++) {
		int x=mx[i]+now_x, y=my[i]+now_y;
		if (x<1 || x>n || y<1 || y>n) continue;
		if (ma[x][y]=='*' || ok[x][y]==1) continue;
		ok[x][y]=1;
		dfs1(x,y,step+1,n_animal,n_cage);
		ok[x][y]=0;
	} 
}
//void DFS ()
//{
//	for (int i=1;i<=remain;i++) {
//		
//	}
//}
int main()
{
	scanf("%d%c",&n,&ma[0][0]);
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n+1;j++)
			scanf("%c",&ma[i][j]);
	scanf("%d",&m);
	for (int i=1;i<=m;i++) scanf("%d%d",&cage_x[i],&cage_y[i]);
	for (int i=1;i<=m;i++) {
		scanf("%d",&v[i]);
		td[i]=0x3f3f3f3f;
	}
	scanf("%d",&r);
	for (int i=1;i<=r;i++) {
		int tmp1,tmp2,tmp3,tmp4;
		scanf("%d%d%d%d",&tmp1,&tmp2,&tmp3,&tmp4);
		if (td[tmp4]>tmp1-1) {
			td[tmp4]=(tmp1-1)*v[tmp4];   // 某个动物的最近的时间能走到的距离 
			tx[tmp4]=tmp2;           // 某个动物的x 
			ty[tmp4]=tmp3;
		}
	}
//	for (int i=1;i<=m;i++)
//		cout<<td[i]<<" ";
//	cout<<endl;
	for (int i=1;i<=m;i++) {  // 第 i个动物 
//		cout<<i<<"!!!"<<endl;
		okk=0;
		if (td[i]==0x3f3f3f3f) {
			remain_animal[++remain]=i;
			continue;
		}
		for (int j=1;j<=m;j++) {  // 去第 j个笼子 
			if (okk==1) break;
			if (ABS(tx[i]-cage_x[j])+ABS(ty[i]-cage_y[j]) < td[i]+v[i]) { // 最起码的剪枝,必须得小于曼哈顿距离 
				dfs1(tx[i],ty[i],0,i,j);
			}
		}
	}
	for (int i=1;i<=remain;i++) {
		for (int j=1;j<=m;j++) {
			if (ok_cage[j]==0) {
				ans[remain_animal[i]].x=cage_x[j];
				ans[remain_animal[i]].y=cage_y[j];
				ok_cage[j]=1;
				break;
			}
		}
	}
	for (int i=1;i<=m;i++)
		printf("%d %d %d\n",i,ans[i].x,ans[i].y);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...