接上次的,标签是BFS专题

其实无论是Deepth还是Breadth都是Search

3278

又是撸过的题目

1426

找一个十进制数(我刚开始看样例以为是二进制数),使得它每一位上都是1或0,且是n的倍数(不包括0)

BFS表搜之后就打表即可

BFS CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int MAX_SIZE=105;
int n,len[MAX_SIZE<<1];
bool q[1048580][MAX_SIZE];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline bool check(bool *bl,int len,int k)
{
int res=0;
for (register int i=1;i<=len;++i)
res=(res*10+bl[i])%k;
return !res;
}
inline void print(bool *bl,int len)
{
for (register int i=1;i<=len;++i)
putchar(bl[i]+'0');
putchar('\n');
}
inline void BFS(void)
{
q[1][1]=1; len[1]=1;
int head=0,tail=1;
bool bl[MAX_SIZE];
while (head<tail)
{
memcpy(bl,q[++head],sizeof(bl));
if (check(bl,len[head],n)) { print(bl,len[head]); return; }
memcpy(q[++tail],bl,sizeof(bl)); len[tail]=len[head]+1; q[tail][len[tail]]=0;
memcpy(q[++tail],bl,sizeof(bl)); len[tail]=len[head]+1; q[tail][len[tail]]=1;
}
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
read(n);
while (n)
{
BFS();
read(n);
}
return 0;
}

打表 CODE

#include<string>
#include<iostream>
using namespace std;
const string ans[201]=
{
"",
"1",
"10",
"111",
"100",
"10",
"1110",
"1001",
"1000",
"111111111",
"10",
"11",
"11100",
"1001",
"10010",
"1110",
"10000",
"11101",
"1111111110",
"11001",
"100",
"10101",
"110",
"110101",
"111000",
"100",
"10010",
"1101111111",
"100100",
"1101101",
"1110",
"111011",
"100000",
"111111",
"111010",
"10010",
"11111111100",
"111",
"110010",
"10101",
"1000",
"11111",
"101010",
"1101101",
"1100",
"1111111110",
"1101010",
"10011",
"1110000",
"1100001",
"100",
"100011",
"100100",
"100011",
"11011111110",
"110",
"1001000",
"11001",
"11011010",
"11011111",
"11100",
"100101",
"1110110",
"1111011111",
"1000000",
"10010",
"1111110",
"1101011",
"1110100",
"10000101",
"10010",
"10011",
"111111111000",
"10001",
"1110",
"11100",
"1100100",
"1001",
"101010",
"10010011",
"10000",
"1111111101",
"111110",
"101011",
"1010100",
"111010",
"11011010",
"11010111",
"11000",
"11010101",
"1111111110",
"1001",
"11010100",
"10000011",
"100110",
"110010",
"11100000",
"11100001",
"11000010",
"111111111111111111",
"100",
"101",
"1000110",
"11100001",
"1001000",
"101010",
"1000110",
"100010011",
"110111111100",
"1001010111",
"110",
"111",
"10010000",
"1011011",
"110010",
"1101010",
"110110100",
"10101111111",
"110111110",
"100111011",
"111000",
"11011",
"1001010",
"10001100111",
"11101100",
"1000",
"11110111110",
"11010011",
"10000000",
"100100001",
"10010",
"101001",
"11111100",
"11101111",
"11010110",
"11011111110",
"11101000",
"10001",
"100001010",
"110110101",
"100100",
"10011",
"100110",
"1001",
"1111111110000",
"11011010",
"100010",
"1100001",
"11100",
"110111",
"11100",
"1110001",
"11001000",
"10111110111",
"10010",
"1110110",
"1010100",
"10101101011",
"100100110",
"100011",
"100000",
"11101111",
"11111111010",
"1010111",
"1111100",
"1111110",
"1010110",
"11111011",
"10101000",
"10111101",
"111010",
"1111011111",
"110110100",
"1011001101",
"110101110",
"100100",
"110000",
"100101111",
"110101010",
"11010111",
"11111111100",
"1001111",
"10010",
"100101",
"110101000",
"1110",
"100000110",
"1001011",
"1001100",
"1010111010111",
"110010",
"11101111",
"111000000",
"11001",
"111000010",
"101010",
"110000100",
"1101000101",
"1111111111111111110",
"111000011",
"1000"
};
int n;
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
while (n)
{
cout<<ans[n]<<endl;
cin>>n;
}
return 0;
}

3126

给出一个四位数,你每次可以替换其中一位上的数字,但是必须满足操作后的数是质数

埃氏筛(不会欧拉筛)之后BFS即可

CODE

#include<cstdio>
#include<cstring>
using namespace std;
const int N=10000;
bool prime[N],vis[N];
int n,a,b,q[N],step[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<'0'||ch>'9') ch=tc();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=tc();
}
inline void write(int x)
{
if (x/10) write(x/10);
putchar(x%10+'0');
}
inline void get_prime(void)
{
for (register int i=2;i<N;++i)
if (prime[i]) for (register int j=i<<1;j<N;j+=i) prime[j]=0;
}
inline int BFS(int a,int b)
{
q[1]=a; step[a]=0; vis[a]=1;
int head=0,tail=1;
while (head<tail)
{
int now=q[++head];
if (now==b) return step[head];
for (register int radix=1;radix<=1000;radix*=10)
for (register int i=0;i<=9;++i)
{
int t=((now/radix/10)*10+i)*radix+(now%radix);
if (t>=1000&&t<=9999&&!vis[t]&&prime[t]) q[++tail]=t,vis[t]=1,step[tail]=step[head]+1;
}
}
return -1;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
memset(prime,true,sizeof(prime));
get_prime();
read(n);
while (n--)
{
read(a); read(b);
memset(vis,0,sizeof(vis));
int k=BFS(a,b);
if (k!=-1) write(k),putchar('\n'); else puts("Impossible");
}
return 0;
}

3087

这是模拟题吧

给你两个长度为c的字符串s1,s2,你每次可以进行洗牌,问几次操作后能使洗过的牌达到目标状态

要注意到,如果已经出现重复了,但是还没有到目标状态,那么就impossible了

map即可

CODE

#include<iostream>
#include<string>
#include<map>
using namespace std;
map <string,bool> hash;
string s1,s2,s,temp;
int n,c;
int main()
{
register int i,j;
std::ios::sync_with_stdio(false);
for (cin>>n,i=1;i<=n;++i)
{
hash.clear();
cin>>c; cin>>s1>>s2>>s;
for (int cnt=1;;++cnt)
{
temp="";
for (j=0;j<c;++j)
temp+=s2[j],temp+=s1[j];
if (temp==s) { cout<<i<<' '<<cnt<<endl; break; }
if (hash[temp]) { cout<<i<<' '<<-1<<endl; break; }
hash[temp]=1; s1.assign(temp,0,c); s2.assign(temp,c,c);
}
}
return 0;
}

3414

给出两个水壶,最大容量为a,b。有以下操作:

  1. FILL(i) 加满i
  2. DROP(i) 把i里的水道光
  3. POUR(i,j) 把i水壶的水全部倒入j水壶中

因为就两个水壶,BFS即可

CODE

#include<iostream>
#include<string>
using namespace std;
const int N=105;
const string F1="FILL(1)",F2="FILL(2)",D1="DROP(1)",D2="DROP(2)",P1="POUR(1,2)",P2="POUR(2,1)";
bool vis[N*N+N];
int a,b,c,q[N*N][2],step[N*N],pre[N*N],rear;
string work[N*N];
inline int hash(int x,int y)
{
return x*N+y;
}
inline int BFS(void)
{
q[1][0]=q[1][1]=0; vis[0]=1; step[1]=0;
int head=0,tail=1,h,x,y,xx,yy;
while (head<tail)
{
x=q[++head][0],y=q[head][1];
if (x==c||y==c) { rear=head; return step[head]; }
h=hash(a,y);
if (!vis[h]) q[++tail][0]=a,q[tail][1]=y,step[tail]=step[head]+1,vis[h]=1,work[tail]=F1,pre[tail]=head;
h=hash(x,b);
if (!vis[h]) q[++tail][0]=x,q[tail][1]=b,step[tail]=step[head]+1,vis[h]=1,work[tail]=F2,pre[tail]=head;
h=hash(0,y);
if (!vis[h]) q[++tail][0]=0,q[tail][1]=y,step[tail]=step[head]+1,vis[h]=1,work[tail]=D1,pre[tail]=head;
h=hash(x,0);
if (!vis[h]) q[++tail][0]=x,q[tail][1]=0,step[tail]=step[head]+1,vis[h]=1,work[tail]=D2,pre[tail]=head;
yy=x+y>b?b:x+y,xx=x+y>b?x+y-b:0;
h=hash(xx,yy);
if (!vis[h]) q[++tail][0]=xx,q[tail][1]=yy,step[tail]=step[head]+1,vis[h]=1,work[tail]=P1,pre[tail]=head;
xx=x+y>a?a:x+y,yy=x+y>a?x+y-a:0;
h=hash(xx,yy);
if (!vis[h]) q[++tail][0]=xx,q[tail][1]=yy,step[tail]=step[head]+1,vis[h]=1,work[tail]=P2,pre[tail]=head;
}
return -1;
}
inline void print(int now)
{
if (pre[now]!=1) print(pre[now]);
cout<<work[now]<<endl;
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>a>>b>>c;
int k=BFS();
if (k!=-1) cout<<k<<endl,print(rear); else cout<<"impossible";
return 0;
}

POJ3278&&1426&&3126&&3087&&3414的更多相关文章

  1. [ACM训练] 算法初级 之 搜索算法 之 广度优先算法BFS (POJ 3278+1426+3126+3087+3414)

    BFS算法与树的层次遍历很像,具有明显的层次性,一般都是使用队列来实现的!!! 常用步骤: 1.设置访问标记int visited[N],要覆盖所有的可能访问数据个数,这里设置成int而不是bool, ...

  2. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略.因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较 ...

  3. 【转】POJ题目分类

    初级:基本算法:枚举:1753 2965贪心:1328 2109 2586构造:3295模拟:1068 2632 1573 2993 2996 图:最短路径:1860 3259 1062 2253 1 ...

  4. 【模拟】POJ 3087

    直达–>POJ 3087 Shuffle'm Up 题意:一开始没怎么看明白,注意现是从S2里拿牌放在最底下,再放S1,这样交叉放(我一开始以为是S1和S2随意哪个先放,分别模拟取最小),然后在 ...

  5. 【BFS】POJ 3414

    直达 -> POJ 3414 Pots 相似题联动–>HDU 1495 非常可乐 题意:两个壶倒水,三种操作,两个桶其中一个满足等于C的最少操作,输出路径.注意a,b互倒的时候能不能倒满, ...

  6. Sublime Text 3 3126 注册码 + 下载地址

    Sublime Text 3 3126  下载地址 Windows版本 64位:https://download.sublimetext.com/Sublime%20Text%20Build%2031 ...

  7. hihoCoder 1426 : What a Ridiculous Election(总统夶选)

    hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...

  8. POJ 3414 Pots

    Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  9. POJ 3087 Shuffle'm Up

    Shuffle'm Up Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

随机推荐

  1. unity 获取水平FOV

    unity中Camera的Field of View是指的垂直FOV,水平FOV可以经过计算得到. 创建脚本如下,把脚本挂载到摄像机上即可得到水平FOV: public class GetHorizo ...

  2. Todolist分别用React与Vue的实现与思考

    源码查看: React 版的TodoList=> 点击跳转 Vue 版的TodoList=> 点击跳转 用React实现的思路: React使用注重的思想是少用state,纯函数实现功能思 ...

  3. GenyMotion the virtual device got no ip address 问题解决

    不要再找答案了 升级你的virtual box到最新版本(目前是 5.0.26,已通过) 如果你是windows 10系统 必须关闭hyper-v 在管理员命令行下运行bcdedit /set hyp ...

  4. Oracle EBS INV 删除保留

    DECLARE p_rsv apps.inv_reservation_global.mtl_reservation_rec_type; p_dummy_sn apps.inv_reservation_ ...

  5. IIS日志导致磁盘被占满

    某服务器只部署了个IIS,应用目录都在D盘,可C盘97.5GB空间却被占满了. 将系统文件,隐藏文件全部显示,再选中所有的C盘文件及文件夹查看容量只有19GB. 既然只部署了IIS,那自然就怀疑到了I ...

  6. PgSQL基础之 安装postgresql数据系统

    参考这位仁兄的文章,真的非常好:https://blog.csdn.net/jerry_sc/article/details/76408116#创建数据目录 后来我又自己写了一个shell脚本,来自动 ...

  7. C++课堂作业_02_PAT1025.反转链表

    The 1st classwork of the C++ program 题目:PAT.1025.反转链表 github链接:Click Here mdzz,做完题目的第一感受= = 这道题的题意就是 ...

  8. 阿里八八Alpha阶段Scrum(8/12)

    今日进度 叶文滔: 已经成功解决兼容性问题,目前正在嵌入多级按钮API,预计明天可以完成 王国超: 今天终于debug了,被卡了几天的fragment嵌套listview终于成功了 俞鋆: 研究了一下 ...

  9. bat脚本,备份数据库并压缩

    forfiles /p "D:\DBBackup" /m "*.sql" /d -08 /c "cmd /c del @path"forfi ...

  10. 20145236《网络对抗》进阶实验——Return-to-libc攻击

    20145236<网络对抗>进阶实验--Return-to-libc攻击 基础知识 Return-into-libc攻击方式不具有同时写和执行的行为模式,因为其不需要注入新的恶意代码,取而 ...