题目:
一块N x N(1=<N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。
写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
比如:
转换前:
@-@
@@-
转换后:
@-@
@--
--@
这种转换采取#1(按顺时针转90度)即可。
注意:图案中的字符"@"和"-"在转90度后,还是"@"和"-"。不要认为"-"转90度后变成"|"。
要点总结:
关键在于封装一个旋转90度的方法然后反复调用,旋转方法需要传入两个数组,如果用一个的话直接在上面操作会覆盖掉原值
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
void rev90(char arr[11][11],char tar[11][11]){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tar[j][n-i+1]=arr[i][j];
}
}
}
bool isequ(char a[11][11],char b[11][11]){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]!=b[i][j]) return false;
}
}
return true;
}
void ref(char arr[11][11],char tar[11][11]){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
tar[i][n-j+1]=arr[i][j];
}
}
}
int main(){
cin>>n;
char ori[11][11];
char target[11][11];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>ori[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>target[i][j];
}
}
char arr1[11][11],arr2[11][11],arr3[11][11],arr4[11][11],arr5[11][11],arr6[11][11],arr7[11][11];
rev90(ori,arr1);
rev90(arr1,arr2);
rev90(arr2,arr3);
ref(ori,arr4);
rev90(arr4,arr5);
rev90(arr5,arr6);
rev90(arr6,arr7);
if(isequ(arr1,target)){
cout<<1;
return 0;
}
if(isequ(arr2,target)){
cout<<2;
return 0;
}
if(isequ(arr3,target)){
cout<<3;
return 0;
}
if(isequ(arr4,target)){
cout<<4;
return 0;
}
if(isequ(arr5,target)||isequ(arr6,target)||isequ(arr7,target)){
cout<<5;
return 0;
}
if(isequ(ori,target)){
cout<<6<<endl;
return 0;
}
cout<<7;
return 0;
}
题目:
明明在上学的时候,参加数学兴趣班。在班上,老师介绍了一种非常有趣的阵列。
该阵列由n个正整数构成,阵列中的数字从1开始递增,数字的排序规则是从1开始由中间逆时针向外转出,2出现在1的下面,然后直至输出n为止。
例如当n=5的时候,阵列如下:
5
1 4
2 3
当n=9时,阵列如下:
7 6 5
8 1 4
9 2 3
当n=10时,阵列如下:
7 6 5
8 1 4
9 2 3
10
明明回家后想自己动手构造这样的阵列。他从n=1开始构造,但是他发现当n越来越大时,阵列的复杂性就越高,然后构造出来的阵列就越容易出错。为了降低构造阵列的出错率,提高构造速度,明明就求助于你,请你帮他写一个程序,来构造这样的阵列。
明明的问题可以归结为:给你一个正整数n,请你按题目描述中所述的方法,构造出阵列。
要点总结:
这里换方向的条件不能是碰壁或者原来有值,因为是从里面往外延申的。注意到步长一样的情况看下会先在一个方向上走这么多步,再在另一个方向上走这么多步,然后会再换方向步长加1。用一层for循环控制步长,一层for循环控制保持该步长时换几次方向(在几个方向上进行)
代码:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int n;
bool flag=false;
while(cin>>n){
int rec[12][12]={0};
int start=6;
rec[start][start]=1;
int bias[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int num=2;
int step=1;
int index=0;
int x=6,y=6;
while(num<=n){
for(int i=0;i<2&&num<=n;i++){
for(int j=0;j<step&&num<=n;j++){
x=x+bias[index][0];
y=y+bias[index][1];
rec[x][y]=num;
num++;
}
index=(index+1)%4;
}
step++;
}
int top=20,bottom=-1,left=20,right=-1;
for(int i=1;i<=11;i++){
for(int j=1;j<=11;j++){
if(rec[i][j]!=0){
if(i<top) top=i;
if(j<left) left=j;
if(i>bottom) bottom=i;
if(j>right) right=j;
}
}
}
if(flag){
cout<<endl;
}else{
flag=true;
}
bool youshi[12]={false};
for(int i=1;i<=11;i++){
for(int j=1;j<=11;j++){
if(rec[i][j]>=10){
youshi[j]=true;
}
}
}
for(int i=top;i<=bottom;i++){
bool yudaog=false;
for(int j=left;j<=right;j++){
if(rec[i][j]!=0){
yudaog=true;
if(j!=left){
cout<<" ";
}
if(youshi[j]&&rec[i][j]<10){
cout<<" "<<rec[i][j];
}else{
cout<<rec[i][j];
}
}else{
if(!yudaog){
if(youshi[j]){
cout<<" ";
}else{
cout<<" ";
}
}
}
}
cout<<endl;
}
}
return 0;
}
题目:
最新的火星探测机器人curiosity被困在了一个二维迷宫里,迷宫由一个个方格组成。
共有四种方格:
'.' 代表空地,curiosity可以穿过它
'#' 代表障碍物,不可穿越,不可停留
'S' 代表curiosity的起始位置
'T' 代表curiosity的目的地
NASA将会发送一系列的命令给curiosity,格式如下:"LRUD"分别代表向左,向右,向上,向下走一步。由于地球和火星之间最近时也有55000000km!所以我们必须提前判断这一系列的指令会让curiosity最终处在什么样的状态,请编程完成它。
要点总结:
要注意一个地方,必须先判断有没有越界,如果交换顺序没有判越界先判了障碍物会报错。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int i=0;i<t;i++){
int n;
cin>>n;
vector<vector<char>> puzzle(n,vector<char>(n));
int sx,sy,tx,ty;
int curx,cury;
for(int j=0;j<n;j++){
string s;
cin>>s;
for(int k=0;k<n;k++){
if(s[k]=='S'){
sx=j;
sy=k;
}
if(s[k]=='T'){
tx=j;
ty=k;
}
puzzle[j][k]=s[k];
}
}
int q;
cin>>q;
for(int j=0;j<q;j++){
string inst;
cin>>inst;
curx=sx;
cury=sy;
bool flag=false;
for(char x : inst){
if(x=='L') cury--;
else if(x=='R') cury++;
else if(x=='U') curx--;
else if(x=='D') curx++;
if(curx>n-1||curx<0||cury<0||cury>n-1){
cout<<"I am out!"<<endl;
flag=true;
break;
}
if(puzzle[curx][cury]=='#'){
cout<<"I am dizzy!"<<endl;
flag=true;
break;
}
}
if(flag) continue;
if(puzzle[curx][cury]=='T') cout<<"I get there!"<<endl;
else cout<<"I have no idea!"<<endl;
}
}
return 0;
}
英语翻译:
大型语言模型可以生成协调连贯的文本,但经常产生幻觉。为了应对这种现象,研究者将大模型与知识图谱想结合,使模型输出基于真实数据。这种结合的方式在保留模型创造性能力的同时显著降低了虚假信息的产生。
人工智能驱动的个性化教育可以适应不同人的学习风格。在线推荐系统在评估后会为学生提供具体的指导路线。例如,数学薄弱的学生可能会收到针对性的练习,然而成绩优秀的学生会得到更有挑战性的学习材料。
自动驾驶依靠人工智能实时处理来自摄像头、激光雷达、雷达的数据。自动驾驶系统可以识别障碍物,预测交通流量并迅速做出决策。即使技术一直在进步,确保在极端天气以及复杂路况下的安全仍然是尚待解决的主要挑战。
lidar激光雷达
