【求助】第九个点蜜汁负值

P1378 油滴扩展

```cpp int anss=s-ans+0.5; cout<<anss; ``` 改成 ```cpp cout<<int(((s-ans)*10+5)/10); ```
by Kiel @ 2018-07-16 11:55:00


@[wangjiachi](/space/show?uid=67418)
by Kiel @ 2018-07-16 11:55:02


@[something](/space/show?uid=84025) 先谢谢了! 第九个点过了但是第七个点变负值了(手动哭笑 还想问一下为什么这样改 谢谢!
by wangjiachi @ 2018-07-24 10:42:39


@[wangjiachi](/space/show?uid=67418) 我把这个改了过后就对了啊
by Kiel @ 2018-07-24 11:05:14


```cpp #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #define maxn 10010 #define inf 1000000007 #define ll long long using namespace std; int n,m,ans=inf; int dx[5]={0,0,1,-1,0}; int dy[5]={0,1,0,0,-1}; struct nn { int a[5][5]; int color;//这一步交换的棋子颜色 int step;//记录步数 }t; queue<nn>q; bool check(nn f)//判断合法解 { for(int i=1;i<=4;i++) { if(f.a[i][1]==f.a[i][2]&&f.a[i][1]==f.a[i][3]&&f.a[i][1]==f.a[i][4])return true;//处理行 if(f.a[1][i]==f.a[2][i]&&f.a[1][i]==f.a[3][i]&&f.a[1][i]==f.a[4][i])return true;//处理列 } if(f.a[1][1]==f.a[2][2]&&f.a[1][1]==f.a[3][3]&&f.a[1][1]==f.a[4][4])return true;//处理对角线 if(f.a[1][4]==f.a[3][2]&&f.a[1][4]==f.a[2][3]&&f.a[1][4]==f.a[4][1])return true; return false; } void init()//处理一开始的棋子颜色 { t.step=0; t.color=2; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { if(t.a[i][j]==2) { for(int k=1;k<=4;k++) { int x=i+dx[k]; int y=j+dy[k]; if(t.a[x][y]==2)continue; if(x>=1&&x<=4&&y>=1&&y<=4)//注意边界 { nn c=t; c.color=t.a[x][y]; c.step=1; swap(c.a[i][j],c.a[x][y]);//移动棋子 q.push(c); } } } } } void bfs()//广搜模板 { while(!q.empty()) { nn b=q.front(); q.pop(); if(check(b)) { ans=b.step; return ; } for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { if(b.a[i][j]==2) { for(int k=1;k<=4;k++) { int x=i+dx[k]; int y=j+dy[k]; if(x>=1&&x<=4&&y>=1&&y<=4&&b.a[x][y]==(b.color^1))//黑白交替移动 { nn c=b; swap(c.a[i][j],c.a[x][y]);//移动棋子 c.color=b.color^1;//如果上一步走的是黑,这一步就是白,上一步是白,这一步是黑。 c.step=b.step+1;//步数加一 q.push(c);//将当前状态入队 } } } } } } int main() { int x,y,z; char s[10]; for(int i=1;i<=4;i++) { scanf("%s",s+1); for(int j=1;j<=4;j++)//处理图,便于广搜 { if(s[j]=='B') { t.a[i][j]=1; } if(s[j]=='W') { t.a[i][j]=0; } if(s[j]=='O') { t.a[i][j]=2; } } } init(); bfs(); printf("%d\n",ans); return 0; } ``` 代码,这个可以过
by Kiel @ 2018-07-24 11:05:48


@[something](/space/show?uid=84025) 我不需要用人家的过 不过谢谢啦! ``` int anss=s-ans+0.5; cout<<anss; ``` ``` cout<<int(((s-ans)*10+5)/10); ``` 但可以解释一下这两个的区别吗
by wangjiachi @ 2018-07-24 11:13:12


@[wangjiachi](/space/show?uid=67418) 这个是我帮你改过之后的垃
by Kiel @ 2018-07-24 11:27:35


@[wangjiachi](/space/show?uid=67418) 这个是由于精度问题
by Kiel @ 2018-07-24 11:28:12


上面的代码不对
by Kiel @ 2018-07-24 11:29:02


@[something](/space/show?uid=84025) 尴尬
by Kiel @ 2018-07-24 11:29:23


| 下一页