社区讨论
求救!!!大佬求救!!!为啥样例过了但是全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 条回复,欢迎继续交流。
正在加载回复...