```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