博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8-1-组队赛
阅读量:4879 次
发布时间:2019-06-11

本文共 6448 字,大约阅读时间需要 21 分钟。

链接:

//这一次是搜索全场.......哎~感觉BFS还行,但DFS不是很懂啊.............= =

A.A Knight's Journey

据说是很经典但也是很水的DFS题目~

题意:在一个p*q的棋盘上,一个knight要环游棋盘 ,每个点只走一遍,要历遍所有的点,问是否可能,若不可以则输出impossible,反之输出坐标。

注:在题目中要求按字典树输出,故要注意坐标点~按下图的序号走,则从(A,1)开始历遍,第一次成功的就是按字典树排列的点~

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 const int add[8][2]={
{-2,-1},{-2,1},{-1,-2},{-1,2},{
1,-2},{
1,2},{
2,-1},{
2,1}}; 7 int a[27][27],p,q,judge,step; 8 9 class K10 {11 public:12 int x,y;13 }knight[100];14 15 void DFS(int x,int y)16 {17 if(judge) return;18 int i,hx,hy;19 knight[step].x=x;20 knight[step].y=y;21 step++;22 if(step==p*q)23 {judge=1;return;}24 a[x][y]=1;25 for(i=0;i<8;i++)26 {27 hx=x+add[i][1];28 hy=y+add[i][0];29 if(hx>=0 && hx

=0 && hy26) {printf("impossible\n\n");continue;}49 memset(a,0,sizeof(a));50 memset(knight,0,sizeof(knight));51 judge=0;52 step=0;53 DFS(0,0);54 if(judge)55 {56 for(i=0;i

B.Avoid The Lakes

很简单~~~BFS

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int a[100][100],maxx,X,Y,G,number; 7 int add[4][2]={
{-1,0},{
1,0},{
0,1},{
0,-1}}; 8 9 class O10 {11 public:12 int x,y;13 }q[10025];14 15 void bfs(int x,int y)16 {17 int f=0,r=1,hx,hy,i;18 memset(q,0,sizeof(q));19 q[0].x=x;20 q[0].y=y;21 a[x][y]=0;22 number=1;23 while(f<=r)24 {25 for(i=0;i<4;i++)26 {27 hx=q[f].x+add[i][1];28 hy=q[f].y+add[i][0];29 if(hx>=0 && hx
=0 && hy
maxx) maxx=number;40 return;41 }42 43 int main()44 {45 while(scanf("%d%d%d",&X,&Y,&G)!=EOF)46 {47 int i,j,k;48 memset(a,0,sizeof(a));49 for(k=0;k

 C.Dungeon Master

比较简单~是一道三维的BFS题目~只要注意三维字符串的输入即可,其它的跟二维相同~

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int number,Z,X,Y,x1,y1,z1,x2,y2,z2; 7 const int add[6][3]={
{
0,1,0},{
0,-1,0},{
1,0,0},{-1,0,0},{
0,0,1},{
0,0,-1}}; 8 char a[30][30][30]; 9 10 class K11 {12 public:13 int x,y,z,step;14 }k[1000000];15 16 void bfs(int z,int x,int y)17 {18 int f=0,r=1,i,hx,hy,hz;19 k[0].x=x;20 k[0].y=y;21 k[0].z=z;22 k[0].step=0;23 a[z][x][y]='#';24 k[1000000]={
0};25 while(f
=0 && hx
=0 && hy
=0 && hz

D.Sum It Up

DFS~

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int N,t,judge,a[10000],k[10000]; 7 8 void DFS(int sum,int x,int step) 9 {10 int i;11 if(sum>N) return;12 if(sum==N)13 {14 printf("%d",k[0]);15 for(i=1;i
N) continue;25 if(a[i]!=last) //重点!!!!last代表跳出的数,避免出现相同式子!!26 {27 last=k[step]=a[i];28 DFS(sum+a[i],i+1,step+1);29 }30 }31 }32 33 int main()34 {35 while(~scanf("%d%d",&N,&t),N,t)36 {37 int i;38 memset(a,0,sizeof(a));39 memset(k,0,sizeof(k));40 for(i=0;i

 

E.N皇后问题

由于数据很小,SO.........采用枚举水过的代码:

1 #include
2 #include
3 using namespace std; 4 int main() 5 { 6 int i,sum; 7 while(~scanf("%d",&i),i) 8 { 9 if(i==1)10 sum=1;11 if(i==2 || i==3)12 sum=0;13 if(i==4)14 sum=2;15 if(i==5)16 sum=10;17 if(i==6)18 sum=4;19 if(i==7)20 sum=40;21 if(i==8)22 sum=92;23 if(i==9)24 sum=352;25 if(i==10)26 sum=724;27 cout<
<

正解:

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 #define N 15 7 int n; 8 int sum; 9 int x[N],b[N];10 11 12 int place(int k)13 {14 int i;15 for(i=1;i
n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于025 sum++;26 else27 for(int i=1;i<=n;i++)28 {29 x[t] = i; //标明第t个皇后放在第i列30 if(place(t)) //如果可以放在某一位置,则继续放下一皇后31 queen(t+1);32 }33 return sum;34 }35 36 int main()37 {38 int t,i;39 for(i=1;i<=10;i++)40 {41 sum=0;42 n=i;43 b[i]=queen(1);44 }45 while(scanf("%d",&n),n)46 {47 printf("%d\n",b[n]);48 }49 return 0;50 }

源代码:

在此基础上做了一小部分改动.........

F.Basic

是变形的N皇后问题~

在每一个能放棋子的点,作为第一个放棋子的点,看能放多少棋子,输出最多能放的棋子数~

代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int n,number; 7 char a[10][10]; 8 9 int judge(int x,int y) //判断该点能否放棋子,在遇到X前,该点所对应的横排和竖排是否有0点,若有则不能放棋子10 {11 int i;12 for(i=x+1;i<=n && a[i][y]!='X';i++)13 if(a[i][y]=='0') return false;14 for(i=x-1;i>=1 && a[i][y]!='X';i--)15 if(a[i][y]=='0') return false;16 for(i=y+1;i<=n && a[x][i]!='X';i++)17 if(a[x][i]=='0') return false;18 for(i=y-1;i>=1 && a[x][i]!='x';i--)19 if(a[x][i]=='0') return false;20 return true;21 }22 23 void DFS(int x,int y,int step) 24 {25 int i,j;26 for(i=1;i<=n;i++)27 for(j=1;j<=n;j++)28 if(a[i][j]=='.' && judge(i,j))29 {30 a[i][j]='0';31 DFS(i,j,step+1);32 a[i][j]='.';33 }34 if(number

 

G.Asteroids!

与第三题很相似,也是三维的BFS~

代码如下:

1 #include
2 #include
3 #include
4 using namespace std; 5 6 int number,quan,N,x1,y1,z1,x2,y2,z2; 7 const int add[6][3]={
{
0,1,0},{
0,-1,0},{
1,0,0},{-1,0,0},{
0,0,1},{
0,0,-1}}; 8 char a[30][30][30]; 9 10 class K11 {12 public:13 int x,y,z,step;14 }k[1000000];15 16 void bfs(int z,int x,int y)17 {18 int f=0,r=1,i,hx,hy,hz;19 memset(k,0,sizeof(k));20 k[0].x=x;21 k[0].y=y;22 k[0].z=z;23 k[0].step=0;24 a[z][x][y]='X';25 while(f
=0 && hx
=0 && hy
=0 && hz

 

转载于:https://www.cnblogs.com/teilawll/p/3231565.html

你可能感兴趣的文章
Math
查看>>
git安装配置
查看>>
从CPU的运行到函数调用做个了解
查看>>
记录一次无聊的(经历了Nodejs -> Shell -> C)的探索问题过程
查看>>
接口请求失败处理,重新请求并限制请求次数.自己封装搞定retry函数
查看>>
C# 数据库连接增删改查
查看>>
Xcode 最近使用的一些问题
查看>>
JSP 自定义标签
查看>>
ACM_水题你要信了(修改版)
查看>>
题解报告:hdu 1087 Super Jumping! Jumping! Jumping!
查看>>
汇编实验一
查看>>
2015 Multi-University Training Contest 6 hdu 5357 Easy Sequence
查看>>
HDU 4856 Tunnels
查看>>
常用的页面加载慢的解决方案
查看>>
Excel催化剂开源第11波-动态数组函数技术开源及要点讲述
查看>>
关于Spring配置文件提示的插件下载
查看>>
软件工程师就业前景
查看>>
asp.net成员管理系统membership详解教程(一)
查看>>
情态动词
查看>>
关于linux的一些基础知识
查看>>