题目:
7 4 3<br>4 1 3<br>0 0 0
NO<br>3
想法:这题用广搜做,y一层一层遍历下去就可得出结果,看代码。。
代码:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int M=101;
bool visited[M][M];
int m,n,s,judge;
struct cola
{
int x,y,all,t;
};
void BFS()
{
queue<cola> qu;
memset(visited,false,sizeof(visited));
cola p,q;
p.x=0;
p.y=0;
p.t=0;
p.all=s;
qu.push(p);
visited[p.x][p.y]=true;
judge=0;
while(!qu.empty())
{
p=qu.front();
qu.pop();
if(p.y==p.all&&p.y==s/2)
{
judge=p.t;
break;
}
if(p.all+p.x>m)
{
q.x=m;
q.y=p.y;
q.all=p.all+p.x-m;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.all+p.x;
q.y=p.y;
q.all=0;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
if(p.all+p.y>n)
{
q.x=p.x;
q.y=n;
q.all=p.all+p.y-n;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.x;
q.y=p.all+p.y;
q.all=0;
q.t = p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
if(p.x+p.y>n)
{
q.x=p.x+p.y-n;
q.y=n;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=0;
q.y=p.x+p.y;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
q.all=p.all+p.x;
q.x=0;
q.y=p.y;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
if(p.x+p.y>m)
{
q.y=p.y+p.x-m;
q.x=m;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
else
{
q.x=p.x+p.y;
q.y=0;
q.all=p.all;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
q.all=p.all+p.y;
q.x=p.x;
q.y=0;
q.t=p.t+1;
if(!visited[q.x][q.y])
{
qu.push(q);
visited[q.x][q.y]=true;
}
}
if(judge==0)
cout<<"NO"<<endl;
else cout<<judge<<endl;
}
int main()
{
int gg;
while((cin>>s>>m>>n)&&(s||m||n))
{
if(s%2)
{
cout<<"NO"<<endl;
continue;
}
if(m>n)
{gg=m;
m=n;
n=gg;
}
BFS();
}
return 0;
}
感想:头文件少了个cstring就怎么也通不过。。但结果却也正确,还是没搞太懂。。