题目1045:百鸡问题
http://ac.jobdu.com/problem.php?pid=1045
int main(){
//1.保存总金额数
int n;
//2.
while(scanf("%d",&n)!=EOF){
//3.枚举法求解
for(int i=0;i<n/5;i++){
for(int j=0;j<n/3;j++){
//3.1判断是否符合条件
if((15*i+9*j+100-i-j)<=3*n){
printf("x=%d,y=%d,z=%d\n",i,j,100-i-j);
}
}
}
}
return 0;
}
题目1456:胜利大逃亡
http://ac.jobdu.com/problem.php?pid=1456
#include<stdio.h>
#include<queue>
using namespace std;
int go[][3]={
1,0,0,
0,1,0,
0,0,1,
-1,0,0,
0,-1,0,
0,0,-1
};
int area[50][50][50];
int mark[50][50][50]={0};
struct E{
int x,y,z;
int time;
};
queue<E> Q;
int BFS(int a,int b,int c,int time){
while(!Q.empty())
Q.pop();
E e;
e.x=0;
e.y=0;
e.z=0;
e.time=0;
Q.push(e);
mark[0][0][0]=1;
while(!Q.empty()){
E tem=Q.front();
Q.pop();
if(tem.x==a-1&&
tem.y==b-1&&
tem.z==c-1&&
tem.time<=time){
return tem.time;
}
if(tem.time>=time)
return -1;
for(int i=0;i<6;i++){
E tem2;
tem2.x=tem.x+go[i][0];
tem2.y=tem.y+go[i][1];
tem2.z=tem.z+go[i][2];
tem2.time=tem.time+1;
if(!(
0<=tem2.x&&tem2.x<a&&
0<=tem2.y&&tem2.y<b&&
0<=tem2.z&&tem2.z<c
)){
continue;
}
if(area[tem2.x][tem2.y][tem2.z]==1||
mark[tem2.x][tem2.y][tem2.z]==1)
continue;
Q.push(tem2);
mark[tem2.x][tem2.y][tem2.z]=1;
}
}
return -1;
}
int main(){
int n;
scanf("%d",&n);
int a,b,c;
int time;
for(int t=0;t<n;t++){
scanf("%d %d %d %d",&a,&b,&c,&time);
for(int i=0;i<a;i++){
for(int j=0;j<b;j++){
for(int k=0;k<c;k++){
scanf("%d",&area[i][j][k]);
mark[i][j][k]=0;
}
}
}
int rlt=BFS(a,b,c,time);
printf("%d\n",rlt);
}
fclose(stdin);
return 0;
}
题目1457:非常可乐
http://ac.jobdu.com/problem.php?pid=1457
#include<stdio.h>
#include<queue>
using namespace std
//标记是否已经存在该状态
int mark[101][101][101]
//保存状态的结构体
struct E{
int a,b,c
int time
}
//保存状态的队列
queue<E> Q
//广度优先搜索
int BFS(int a,int b,int c){
//1.放入初始状态
E e
e.a=a
e.b=0
e.c=0
e.time=0
mark[a][0][0]=1
Q.push(e)
//2.循环直到队列为空
while(!Q.empty()){
//2.1取出队列元素,判断是否可以
E tem=Q.front()
Q.pop()
if(tem.a==tem.b&&tem.c==0 ||
tem.a==tem.c&&tem.b==0 ||
tem.b==tem.c&&tem.a==0
){
return tem.time
}
//2.2向其它方向进行扩展
//a倒入b
if(tem.a>0&&
tem.b<b
){
E tem2
//可以全部倒入
if(tem.a+tem.b<=b){
tem2.a=0
tem2.b=tem.a+tem.b
tem2.c=tem.c
}else{
tem2.a=tem.a-b+tem.b
tem2.b=b
tem2.c=tem.c
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
//a倒入c
if(tem.a>0&&
tem.c<c
){
E tem2
//可以全部倒入
if(tem.a+tem.c<=c){
tem2.a=0
tem2.b=tem.b
tem2.c=tem.a+tem.c
}else{
tem2.a=tem.a-c+tem.c
tem2.b=tem.b
tem2.c=c
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
//b倒入c
if(tem.b>0&&
tem.c<c
){
E tem2
//可以全部倒入
if(tem.b+tem.c<=c){
tem2.a=tem.a
tem2.b=0
tem2.c=tem.b+tem.c
}else{
tem2.a=tem.a
tem2.b=tem.b-c+tem.c
tem2.c=c
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
//b倒入a
if(tem.b>0&&
tem.a<a
){
E tem2
//可以全部倒入
if(tem.a+tem.b<=a){
tem2.a=tem.a+tem.b
tem2.b=0
tem2.c=tem.c
}else{
tem2.a=a
tem2.b=tem.b-a+tem.a
tem2.c=tem.c
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
//c倒入a
if(tem.c>0&&
tem.a<a
){
E tem2
//可以全部倒入
if(tem.a+tem.c<=a){
tem2.a=tem.a+tem.c
tem2.b=tem.b
tem2.c=0
}else{
tem2.a=a
tem2.b=tem.b
tem2.c=tem.c-a+tem.a
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
//c倒入b
if(tem.c>0&&
tem.b<b
){
E tem2
//可以全部倒入
if(tem.b+tem.c<=b){
tem2.a=tem.a
tem2.b=tem.b+tem.c
tem2.c=0
}else{
tem2.a=tem.a
tem2.b=b
tem2.c=tem.c-b+tem.b
}
tem2.time=tem.time+1
if(mark[tem2.a][tem2.b][tem2.c]==0 &&
tem2.a>=0&&tem2.a<=a&&
tem2.b>=0&&tem2.b<=b&&
tem2.c>=0&&tem2.c<=c
){
mark[tem2.a][tem2.b][tem2.c]=1
Q.push(tem2)
}
}
}
return -1
}
int main(){
//1.保存3个杯子的容积
int a,b,c
//2.
while(scanf("%d %d %d",&a,&b,&c)!=EOF&&a!=0&&b!=0&&c!=0){
//2.1排空队列
while(!Q.empty()){
Q.pop()
}
//2.2初始化mark数组
for(int i=0
for(int j=0
for(int k=0
mark[i][j][k]=0
}
}
}
//3.广度优先搜索
int rlt=BFS(a,b,c)
//4.输出结果
if(rlt!=-1){
printf("%d\n",rlt)
}else{
printf("NO\n")
}
}
return 0
}
题目1459:Prime ring problem
http://ac.jobdu.com/problem.php?pid=1459
#include<stdio.h>
#include<math.h>
using namespace std;
int primering[18];
int mark[18];
bool checkrlt(int a,int b){
int tem=a+b;
for(int i=2;i<sqrt(tem)+1;i++){
if(tem%i==0)
return false;
}
return true;
}
void DFS(int n,int *primering,int cnt){
if(cnt==n){
if(checkrlt(primering[1],primering[cnt])){
for(int i=1;i<n;i++){
printf("%d ",primering[i]);
}
printf("%d\n",primering[n]);
}
return;
}
for(int i=2;i<=n;i++){
if(mark[i]!=0)
continue;
if(checkrlt(i,primering[cnt])){
mark[i]=1;
primering[cnt+1]=i;
DFS(n,primering,cnt+1);
mark[i]=0;
}
}
}
int main(){
int n;
int cnt=0;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
primering[i]=0;
mark[18]=0;
}
cnt++;
printf("Case %d:\n",cnt);
primering[1]=1;
DFS(n,primering,1);
printf("\n");
}
return 0;
}
题目1460:Oil Deposit
http://ac.jobdu.com/problem.php?pid=1460
#include<stdio.h>
int go[][2]={
1,0,
0,1,
-1,0,
0,-1,
1,1,
1,-1,
-1,1,
-1,-1
};
char oil[101][101];
int mark[101][101];
void DFS(int m,int n,int i,int j,int (&mark)[101][101],char (&oil)[101][101]){
mark[i][j]=1;
for(int k=0;k<8;k++){
if(i+go[k][0]>=1&&i+go[k][0]<=m&&
j+go[k][1]>=1&&j+go[k][1]<=n
){
if(mark[i+go[k][0]][j+go[k][1]]==1||oil[i+go[k][0]][j+go[k][1]]=='*')
continue;
else
DFS(m,n,i+go[k][0],j+go[k][1],mark,oil);
}
}
}
int main(){
int m,n;
while(scanf("%d %d",&m,&n)!=EOF&&m!=0){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
mark[i][j]=0;
}
}
for(int i=1;i<=m;i++){
scanf("%s",oil[i]+1);
}
int cnt=0;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(mark[i][j]==1||oil[i][j]=='*')
continue;
DFS(m,n,i,j,mark,oil);
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}