一、七星填数
题目链接:77777777777777
题目要求:
如下图所示。在七角星的 14 个节点上填入 1 ~ 14的数字,不重复,不遗漏。 要求每条直线上的四个数字之和必须相等。
图中已经给出了 3 个数字。 请计算其它位置要填充的数字,答案唯一。
填好后,请输出绿色节点的 4 个数字(从左到右,用空格分开)。
解题思路:
全排列 判断是否每一列
#include<bits/stdc++.h> using namespace std; int main() { int a[11] = { 1,2,3,4,5,7,8,9,10,12,13}; int aa,b,c,d,e,f,g; do{ aa = 6 + a[2] + a[5] + 11; b = 11 + a[7] + a[8] + a[9]; c = a[9] + a[6] + a[4] + a[0]; d = a[0] + a[1] + a[2] + a[3]; e = a[3] + a[5] + a[7] + a[10]; f = a[10] + a[8] + a[6] + 14; g = 14 + a[4] + a[1] + 6; if(aa == b && aa == c && aa == d && aa == e && aa == f && aa == g) { cout << a[0] << ' ' << a[1] << ' ' << a[2] << ' ' << a[3] << endl; } }while (next_permutation(a, a + 11)); return 0; }
二、旋转
题目链接:大鸟转转转
题目要求:
解题思路:
模拟·~~~~,让输出第一行循环变列,第二层是行的倒序输出就行。
#include<bits/stdc++.h> using namespace std; int a[10001][10001]; int main() { int n,m; cin>>n>>m; for(int i=0;i { for(int j=0;j { cin>>a[i][j]; } } for(int i=0;i { for(int j=n-1;j>=0;j--) { cout<<a[j][i]<<" "; } cout<<endl; } return 0; }
三、迷宫与陷阱
题目链接:非常友好的迷宫
题目要求:
小明在玩一款迷宫游戏,在游戏中他要控制自己的角色离开一间由NxN个格子组成的2D迷宫。
小明的起始位置在左上角,他需要到达右下角的格子才能离开迷宫。
每一步,他可以移动到上下左右相邻的格子中(前提是目标格子可以经过)。
迷宫中有些格子小明可以经过,我们用'.'表示;
有些格子是墙壁,小明不能经过,我们用'#'表示。
此外,有些格子上有陷阱,我们用'X'表示。除非小明处于无敌状态,否则不能经过。
有些格子上有无敌道具,我们用'%'表示。
当小明第一次到达该格子时,自动获得无敌状态,无敌状态会持续K步。
之后如果再次到达该格子不会获得无敌状态了。
处于无敌状态时,可以经过有陷阱的格子,但是不会拆除/毁坏陷阱,即陷阱仍会阻止没有无敌状态的角色经过。
给定迷宫,请你计算小明最少经过几步可以离开迷宫
解题思路:
这是一个bfs的变种,不难,我们需要注意的是如果进入无敌状态的话我们可以回到之前走过的路径并且可以过陷阱,但是我们不能过墙,于是我们就加一个flag在结构体里判断即可,注意 如果此时你有无敌状态重新吃到无敌药水是重置时间而不是累加,用结构体加queue,四个方向,然后判断是否走过和药水-1是否为0,因为如果你药水为下一步为0就会卡在陷阱里面,所以需要判断,也因为无敌能走走过的路,如果无敌药水-1>0就不用管走没走过了,(无敌真叼)
#include<bits/stdc++.h> using namespace std; int n,m; char mp[1010][1010]; int vis[1010][1010]; int dx[]={1,-1,0,0}; int dy[]={0,0,1,-1}; struct node{ int x,y,flag,step; }; int bfs() { queue<node>q; q.push({1,1,0}); while(q.size()) { node t=q.front(); int flag = t.flag; int step = t.step; q.pop(); if(t.x==n&&t.y==n) { return step; } for(int i=0;i<4;i++) { int tx=t.x+dx[i]; int ty=t.y+dy[i]; if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&mp[tx][ty]!='#') { if(mp[tx][ty]=='X'&&flag) { if(vis[tx][ty]==0||flag-1>0) { vis[tx][ty] = 1; q.push({tx,ty,flag-1,step+1}); continue; } } if(mp[tx][ty]=='.') { if(vis[tx][ty]==0||flag-1>0) { vis[tx][ty] = 1; if(flag) { q.push({tx,ty,flag-1,step+1}); } else { q.push({tx,ty,flag,step+1}); } continue; } } if(mp[tx][ty]=='%'&&vis[tx][ty]==0) { vis[tx][ty] = 1; q.push({tx,ty,m,step+1}); continue; } } } } return -1; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>mp[i][j]; } } cout<<bfs(); return 0; }
四、九宫幻方
题目链接:感觉OJ有毛病的一道题
题目要求:
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。
三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀:“二四为肩,六八为足,左三右七,戴九履一,五居其中”,通过这样的一句口诀就能够非常完美的构造出一个九宫格来。
4 9 2
3 5 7
8 1 6
有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。
而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~
解题思路:
这是一个全排列判断题,但是也可以打表,因为幻方不多,就八个,所以我用的打表,不过为我不知道为什么这个oj就是给我过不去!!!!!气死我了,编译器能过。
#include<bits/stdc++.h> using namespace std; int check(char s[],char p[]) { for(int i=0;i<9;i++) { if(s[i]=='0') { continue; } if(s[i]==p[i]) { continue; } return 0; } return 1; } int main() { char s[8][10]={ {"492357816"}, {"438951276"}, {"294753618"}, {"276951438"}, {"672159834"}, {"618753294"}, {"834159672"}, {"816357492"}}; int num,sum; char ss[9]; for(int i=0;i<9;i++) { cin>>num; ss[i]=num+'0'; } for(int i=0;i<8;i++) { if(check(ss,s[i])) { sum++; if(sum>1) { break; } for(int j=0;j<9;j++) { cout<<s[i][j]<<" "; if((j+1)%3==0) { cout<<endl; } } } } if(sum>1) { cout<<"Too Many"; } return 0; }
五、大臣的旅费
题目链接:大臣的旅费(树
题目要求:
很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。
为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。
J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。
聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。
J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?
解题思路:
这是一个树,用邻接矩阵存一下dfs应该就行了,但是呢,我不会,寄!