ID
Origin
Title
454 / 1008 Problem A POJ 1321 棋盘问题
  328 / 854 Problem B POJ 2251 Dungeon Master
335 / 1101 Problem C POJ 3278 Catch That Cow
  161 / 503 Problem D POJ 3279 Fliptile
247 / 526 Problem E POJ 1426 Find The Multiple
205 / 330 Problem F POJ 3126 Prime Path
  143 / 305 Problem G POJ 3087 Shuffle'm Up
  129 / 347 Problem H POJ 3414 Pots
  141 / 463 Problem I FZU 2150 Fire Game
  134 / 710 Problem J UVA 11624 Fire!
  255 / 399 Problem K POJ 3984 迷宫问题
  196 / 276 Problem L HDU 1241 Oil Deposits
177 / 408 Problem M HDU 1495 非常可乐
  182 / 577 Problem N HDU 2612 Find a way
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

454 / 1008 Problem A POJ 1321 棋盘问题

d.在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

s.dfs

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char cb[][];//棋盘
int col[];//标记当前列是否有棋子
int ans,n,k;//ans 记录方案总数 void dfs(int row,int sum){//行,已放置的总数
if(sum==k){//已摆放的棋子总数 等于 k
ans++;
return;
}
int i,j;
for(i=row;i<n;i++){//遍历行,从没有放置棋子的row行开始遍历
for(j=;j<n;j++){//遍历列,从第一列开始遍历
if(cb[i][j]=='#'&&!col[j]){//棋盘区域,并且当前列没有棋子
col[j]=;
dfs(i+,sum+);//在下一行中寻找放置棋子的位置
col[j]=;//取消标记
}
}
}
}
int main(){
int i;
while(~scanf("%d%d",&n,&k)){
if(n==-&&k==-)break;
ans=;//方案总数
memset(col,,sizeof(col));//标记初始化
memset(cb,'\0',sizeof(cb));//棋盘初始化
for(i=;i<n;i++)scanf("%s",cb[i]);
dfs(,);//0行,已放置总数0个
printf("%d\n",ans);
}
return ;
}

328 / 854 Problem B POJ 2251 Dungeon Master

335 / 1101 Problem C POJ 3278 Catch That Cow

d.起始位置N,目标位置K。

3种操作,当前+1、当前-1、当前*2

s.bfs

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int Ma=;
bool vis[Ma+];//标记访问
int ti[Ma+];//记录时间
int n,k;//农夫、牛的位置 void bfs(){//广搜
int i,now,temp;
queue<int>q;
memset(ti,,sizeof(ti));
memset(vis,false,sizeof(vis));//初始化都未被访问
q.push(n);//初始位置入队
vis[n]=true;
while(!q.empty()){
now=q.front();
q.pop();
if(now==k){//判断在这,如果抓到牛了
printf("%d\n",ti[k]);
return;
}
for(i=;i<=;i++){//枚举下一步的三种移动方案,x-1、x+1、2*x
switch(i){
case :temp=now-;break;
case :temp=now+;break;
case :temp=now+now;break;
}
if(!vis[temp]&&temp>=&&temp<=Ma){//当前位置未被访问,且位置合法
vis[temp]=;//标记访问
ti[temp]=ti[now]+;//时间=当前位置时间+1
q.push(temp);//位置入队
}
}
} }
int main(){
while(~scanf("%d%d",&n,&k)){
bfs();
}
return ;
}

161 / 503 Problem D POJ 3279 Fliptile

247 / 526 Problem E POJ 1426 Find The Multiple

d.给出n,求一个n的倍数,这个倍数只含0或1

s.bfs

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std; int main(){
__int64 t,t2;
int n,i;
while(~scanf("%d",&n)&&n!=){
queue<__int64>q;//队列定义在循环内,每次就不用清空了
q.push();//首位必须为1
while(!q.empty()){
t=q.front();
q.pop();
if(t%n==){//找到了倍数,输出
printf("%I64d\n",t);break;
}
for(i=;i<=;i++){// 每次最后一位 加个0 或者 加个1
t2=t*+i;
q.push(t2);
}
}
}
return ;
}

205 / 330 Problem F POJ 3126 Prime Path

d.一个4位的素数到另外一个4位的素数,每次只能改变一位,改变后也必须是素数,求最少需要的步数。

s.bfs

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std; const int Ma=;//覆盖所有的四位数
bool mark[Ma];//标记素数
int s[Ma];//记录步数
bool f[Ma];//标记访问
void sieve_prime(){//素数筛法
memset(mark,true,sizeof(mark));
mark[]=mark[]=false;
int k=sqrt(Ma),i,j;
for(i=;i<k;i++)
if(mark[i])
for(j=i*i;j<Ma;j+=i)
mark[j]=false;
}
int change(int x,int i,int j){//x的第i位数字 变为j
if(i==)return j*+(x%);//依次改变1-4位的数字
if(i==)return (x/)*+j*+x%;
if(i==)return (x/)*+j*+x%;
if(i==)return (x/)*+j;
}
int main(){
sieve_prime();//先求出素数
int t,x,y,ans,now,temp,i,j,flag;//
scanf("%d",&t);//测试用例
while(t--){
memset(f,false,sizeof(f));//初始未访问
ans=-;
flag=;//标记是否找到路径
scanf("%d%d",&x,&y);//起点 和终点
queue<int>q;//队列定义在循环内,不用每次用的时候清空了
q.push(x);//x入队
now=s[x]=;//初始当前步数、x的步数 为0
f[x]=true;//x标记为访问
while(!q.empty()){
now=q.front();
q.pop();
if(now==y){//如果到达终点
flag=;//标记找到路径
break;//退出循环
}
for(i=;i<=;i++){//第几位
for(j=;j<=;j++){//变成几
if(!(j==&&i==)){//首位不能变为0
temp=change(now,i,j);
if(!mark[temp]||f[temp])continue;//不是素数,或已经访问过
s[temp]=s[now]+;//下个位置的步数为 当前步数+1
f[temp]=true;//标记temp为访问
q.push(temp);//temp 入队
}
}
}
}
if(flag)printf("%d\n",s[y]);
else printf("Impossible\n");
}
return ;
}

143 / 305 Problem G POJ 3087 Shuffle'm Up
129 / 347 Problem H POJ 3414 Pots
141 / 463 Problem I FZU 2150 Fire Game
134 / 710 Problem J UVA 11624 Fire!
255 / 399 Problem K POJ 3984 迷宫问题
196 / 276 Problem L HDU 1241 Oil Deposits

177 / 408 Problem M HDU 1495 非常可乐

d. S 可乐的体积 , N 和 M是两个杯子的容量。这三个容器可以来回倒,求平分可乐的最少次数。

s.bfs

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int vist[][][],a,b,c;//a b c->S 可乐的体积 , N 和 M是两个杯子的容量
struct node
{
int a,b,c;//分别表示可乐瓶子,杯子1,杯子2它们里面的可乐体积
int step;//步数
};
int sum=;
void bfs()
{
queue<node>q;
memset(vist,,sizeof(vist));
node p1;
p1.a=a;
p1.b=;
p1.c=;
p1.step=;
q.push(p1);
vist[p1.a][][]=;
while(!q.empty())
{
p1=q.front();
q.pop();
if((p1.a==a/&&p1.b==a/)||(p1.a==a/&&p1.c==a/)||(p1.b==a/&&p1.c==a/))
{
printf("%d\n",p1.step);
return;
}
//
node p2;
if(p1.a!=)
{//a倒入b
if(p1.a>b-p1.b)
{
p2.a=p1.a-(b-p1.b);
p2.b=b;
p2.c=p1.c;
p2.step=p1.step+;
}
else
{
p2.a=;
p2.b=p1.b+p1.a;
p2.c=p1.c;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
} if(p1.a!=)
{//a倒入c
if(p1.a>c-p1.c)
{
p2.a=p1.a-(c-p1.c);
p2.b=p1.b;
p2.c=c;
p2.step=p1.step+;
}
else
{
p2.a=;
p2.b=p1.b;
p2.c=p1.c+p1.a;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
} if(p1.b!=)
{//b倒入a
if(p1.b>a-p1.a)
{
p2.b=p1.b-(a-p1.a);
p2.a=a;
p2.c=p1.c;
p2.step=p1.step+;
}
else
{
p2.b=;
p2.a=p1.a+p1.b;
p2.c=p1.c;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
} if(p1.b!=)
{//b倒入c
if(p1.b>c-p1.c)
{
p2.b=p1.b-(c-p1.c);
p2.a=p1.a;
p2.c=c;
p2.step=p1.step+;
}
else
{
p2.b=;
p2.a=p1.a;
p2.c=p1.c+p1.b;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
} if(p1.c!=)
{//c倒入a
if(p1.c>a-p1.a)
{
p2.c=p1.c-(a-p1.a);
p2.a=a;
p2.b=p1.b;
p2.step=p1.step+;
}
else
{
p2.c=;
p2.a=p1.a+p1.c;
p2.b=p1.b;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
} if(p1.c!=)
{//c倒入b
if(p1.c>b-p1.b)
{
p2.c=p1.c-(b-p1.b);
p2.a=p1.a;
p2.b=b;
p2.step=p1.step+;
}
else
{
p2.c=;
p2.a=p1.a;
p2.b=p1.b+p1.c;
p2.step=p1.step+;
}
if(!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c]=;
q.push(p2);
}
}
}
printf("NO\n");
}
int main()
{
while(~scanf("%d%d%d",&a,&b,&c))
{ if(a==&&b==&&c==){
break;
} if(a%==)
{
printf("NO\n");
continue;
} bfs();
}
return ;
}

182 / 577 Problem N HDU 2612 Find a way

[kuangbin带你飞]专题一 简单搜索的更多相关文章

  1. [kuangbin带你飞]专题一 简单搜索 题解报告

    又重头开始刷kuangbin,有些题用了和以前不一样的思路解决.全部题解如下 点击每道题的标题即可跳转至VJ题目页面. A-棋盘问题 棋子不能摆在相同行和相同列,所以我们可以依此枚举每一行,然后标记每 ...

  2. [kuangbin带你飞]专题一 简单搜索(回顾)

    A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...

  3. [kuangbin带你飞]专题一 简单搜索 - E - Find The Multiple

    //Memory Time //2236K 32MS #include<iostream> using namespace std; ]; //保存每次mod n的余数 //由于198的余 ...

  4. [kuangbin带你飞]专题一 简单搜索 棋盘问题

    题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...

  5. [kuangbin带你飞]专题一 简单搜索 回顾总结

    第二题:bfs,忘了将queue清空. 第三题:bfs,记得使用vis数组,防止重复入队

  6. 迷宫问题 POJ - 3984 [kuangbin带你飞]专题一 简单搜索

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  7. [kuangbin带你飞]专题一 简单搜索 Find a way HDU - 2612

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...

  8. Catch That Cow POJ - 3278 [kuangbin带你飞]专题一 简单搜索

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...

  9. Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

随机推荐

  1. TKinter之菜单

    菜单的分类也较多,通常可以分为下拉菜单.弹出菜单. 1.使用Menu类创建一个菜单 2.add_command添加菜单项,如果该菜单是顶层菜单,则添加的菜单项依次向右添加. 如果该菜单时顶层菜单的一个 ...

  2. AMD规范:define和require的区别

    define和require在依赖处理和回调执行上都是一样的,不一样的地方是define的回调函数需要有return语句返回模块对象(注意是对象),这样define定义的模块才能被其他模块引用:req ...

  3. 在.net中悄悄执行dos命令,并获取执行的结果(转)

    一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = ...

  4. CSharp 如何通过拼接XML调用存储过程来查询数据

    每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <sum ...

  5. WCF学习心得------(二)设计和实现服务协定

    设计和实现服务协定 创建服务协定—WCF术语 消息 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息头. 服务 服务是一个构造,它公开一个或多个终结点,其中每个终结点都公开一个或多个 ...

  6. Slow HTTP Denial of Service Attack

    整改建议 1.中断使用URL不支持HTTP方法访问的会话 2.限制HTTP头及包长至一个合理数值 3.设置一个绝对的会话超时时间 4.服务器支持backlog的情况下,需设置一个合理的大小 5.设置一 ...

  7. SqlServer数据库的查询优化

    建立一个web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用 ...

  8. SqlDataAdapter怎么处理事务呢

    SqlDataAdapter怎么处理事务呢,没找到相关代码,哪位朋友能提供下   解决方案 » this._DBAdpt-------------SqlDataAdapterthis._DBConn- ...

  9. discuz!3 二次开发C#学者

    PHP入门,从搞数据库开始: 大致看了以下PHP还是很简单的 比如链接数据库,就这么几行,比asp.net简单的多,就是需要自己搞数据的显示,需要精通HTML和代码生成技术: <?php $co ...

  10. WIN7 清除任务栏图标缓存

    如果任务栏上锁定程序如果换了位置,如:剪切走了.图标会变成白色图标. 解决方法: rem 关闭Windows外壳程序explorer taskkill /f /im explorer.exe rem ...