实验内容:
Question 1.古代一位国王和他的张、王、李、赵、钱五位将军一同出外打猎,各人的箭上都刻有自己的姓氏。
打猎中,一只鹿中箭倒下,但不知是何人所射。
张说:"或者是我射中的,或者是李将军射中的。"
王说:"不是钱将军射中的。"
李说:"如果不是赵将军射中的,那么一定是王将军射中的。"
赵说:"既不是我射中的,也不是王将军射中的。"
钱说:"既不是李将军射中的,也不是张将军射中的。"
国王让人把射中鹿的箭拿来,看了看,说:"你们五位将军的猜测,只有两个人的话是真的."请判断是谁射中鹿。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
char a[11] = "张王李赵钱";
bool b[5] = {0};
for(int i=0;i<5;i++){
b[i] = 1;//假设是第i位将军射中的
int rightNum=0;
if(b[0]||b[2])
++rightNum;
if(!b[4])
++rightNum;
if(b[1]||b[3])
++rightNum;
if(!b[1]&&!b[3])
++rightNum;
if(!b[0]&&!b[2])
++rightNum;
if(rightNum==2)
cout<<a[i*2]<<a[i*2+1]<< "将军射中的"<<endl;
b[i] = 0;
}
system("pause");
return 0;
}
Question 2.输入一个自然数N(2≤N≤9),要求输出如下的魔方阵,即边长为N行N列,元素取值为1至N*N,1在左上角,呈顺时针方向依次放置各元素。如输入4,输出:
1 2 3 4
11 16 15 6
10 9 8 7
问题剖析:方阵一般使用二维数组解决问题,因此首先定义一个动态二维数组
int **a = new int*[n];
for(int i=0;i<n;i++){
a[i] = new int[n];
for(int j=0;j<n;j++)
a[i][j]=0;
}
然后关键就是如何控制方向转变,此处使用到continue语句来转向
int i=0,b=1,j=-1,k=0;
while(b<=n*n){
if(k==0){
j++;
if(j>=n||a[i][j]>0){
j--;
k=1;
continue;
}
}
if(k==1){
i++;
if(i>=n||a[i][j]>0){
i--;
k=2;
continue;
}
}
if(k==2){
j--;
if(j<0||a[i][j]>0){
j++;
k=3;
continue;
}
}
if(k==3){
i--;
if(a[i][j]>0){
i++;
k=0;
continue;
}
}
a[i][j] = b;
b++;
}