黑马程序员技术交流社区
标题:
求算法
[打印本页]
作者:
王震
时间:
2013-6-22 23:31
标题:
求算法
输入一个数,然后显示这样规律的图怎样做
1 2
4 3
7 8 9
6 1 2
5 4 3
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
作者:
黄文超
时间:
2013-6-23 11:02
这是一个数字按照逆时针填充的的图像。
一个数字包含三个信息,它的值、x坐标和y坐标
令数字1的坐标为(0,0).
那么他的下一个数2,填充到其右边的位置,坐标为(1,0)
这时就要检查2的逆时针位置(1,-1)是否有数字存在,
如果有,则3应填充在2的右边(2,0),如果没有,则3填充在2的下边(1,-1)。
以此类推,检查当前数字的逆时针位置,
如果已经有数字存在,则按照当前数字的填充方向,继续填充
如果没有数字存在,则填充到逆时针位置
将所有数字的值和坐标信息保存在列表中
输出时,先输出最上面的一列(y坐标最大),从x坐标最小的数开始输出
换行后,输出y坐标减1的那一列,也是从x坐标最小的数开始输出
直到输出全部的数字
就可以达到楼主的效果
作者:
黄文超
时间:
2013-6-23 12:04
本帖最后由 黄文超 于 2013-6-23 20:18 编辑
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//坐标极限值
int xMin = 0;
int xMax = 0;
int yMin = 0;
int yMax = 0;
//表,用于保存数字坐标
List<NumInfo> numList =new List<NumInfo>();
//当前数字
NumInfo currentNum=new NumInfo();
//当前数字逆时针位置的数字
NumInfo nextNum = new NumInfo();
//数字的填充方向
MoveTo move = MoveTo.Right;
Console.WriteLine("请输入一个数字");
//获取输入的数字
int numGet = 0;
try
{
numGet = int.Parse(Console.ReadLine());
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
//给每个数字添加坐标
for (int i = 1; i <= numGet; i++)
{
if (i == 1)
{
currentNum.Num = i;
currentNum.x = 0;
currentNum.y = 0;
numList.Add(currentNum);
//指定下一次数字出现的方向
move = MoveTo.Right;
}
else
{
currentNum.Num = i;
nextNum = currentNum;
switch (move)
{
case MoveTo.Right:
currentNum.x++;//向右填充,x增加
if (xMax < currentNum.x)
{
xMax = currentNum.x;//保存x的最大值
}
nextNum.x=currentNum.x;//因为当前向右填充,所以检查下方位置,x不变
nextNum.y--;//因为当前向右填充,所以检查下方位置,y减1
break;
case MoveTo.Down:
currentNum.y--;
if (yMin > currentNum.y)
{
yMin = currentNum.y;
}
nextNum.y = currentNum.y;
nextNum.x--;
break;
case MoveTo.Left:
currentNum.x--;
if (xMin > currentNum.x)
{
xMin = currentNum.x;
}
nextNum.x = currentNum.x;
nextNum.y++;
break;
case MoveTo.Up:
currentNum.y++;
if (yMax < currentNum.y)
{
yMax = currentNum.y;
}
nextNum.y = currentNum.y;
nextNum.x++;
break;
}
//将当前数字的信息添加到列表中
numList.Add(currentNum);
//检查逆时针方向的下一个点有无点,若无,则变化填充方向。
for (int j = 0; j < numList.Count; j++)
{
//有一个点在逆时针方向的下一个点的位置
if ((nextNum.x == numList[j].x) && (nextNum.y == numList[j].y))
{
break;
}
//不存在这样的点,改变填充方向
else if (j == numList.Count-1)
{
switch (move)
{
case MoveTo.Right:
move = MoveTo.Down;//右逆时针旋转后为向下
break;
case MoveTo.Down:
move = MoveTo.Left;
break;
case MoveTo.Left:
move = MoveTo.Up;
break;
case MoveTo.Up:
move = MoveTo.Right;
break;
}
}
}
}
}
//数字坐标生成完毕
//输出数字
for (int y = yMax; y >= yMin; y--)
{
for (int x = xMin; x <= xMax; x++)
{
//查找坐标为(x,y)的数字并输出,若无,则用空格填充
string tempNum=null;
for (int n = 0; n < numList.Count; n++)
{
if (numList[n].x == x && numList[n].y == y)
{
tempNum = numList[n].Num.ToString();
numList.RemoveAt(n);
break;
}
else if (numList.Count - 1 == n)
{
tempNum = " ";
}
}
Console.Write(tempNum);
if (x < xMax)
{
Console.Write("\t");
}
}
Console.WriteLine();
}
Console.ReadLine();
}
}
//定义一个结构体用于记录数字的信息
struct NumInfo
{
public int Num;
public int x;
public int y;
}
enum MoveTo { Right, Down, Left, Up }
}
//这是参考代码
复制代码
作者:
曾大鹏
时间:
2013-6-23 16:23
楼上的你
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 螺旋矩阵
{
class Program
{
static void Main(string[] args)
{
/*
思路:
从样例给中的矩阵也就是n=7的时候,我们可以发现以下规律:
* //第一圈
* 1向右走1步就可以达到2
* 然后2向下走1步可以达到3
* 然后3向左走2步可以到5
* 然后5向上走2步可以达到7
//第二圈
* 7向右走3步就可以达到10
* 然后10向下走3步可以达到13
* 然后13向左走4步可以到17
* 然后17向上走4步可以达到21
==============================
得出
向右走的步数为1,3,5,7 ...2*n+1;
向下走的步数为1,3,5,7 ...2*n+1;
向左走的步数为2,4,6,8 ...2*n;
向上走的步数为2,4,6,8 ...2*n;
然后就是根据此规律得出一个螺旋矩阵
*
*/
Console.WriteLine("请输入n的值");
string str = Console.ReadLine();
int n, i, j;
//定义一个二维数组a
int [,]a=new int[100,100];
//定义一个string数组s
string[,] s = new string[100, 100];
bool flag=int.TryParse(str, out n);
if (flag)
{
//数组初始化
for ( i = 1; i <=n; i++)
{
for (j = 1; j <=n; j++)
{
a[i, j] = 0;
}
}
//posI,posJ表示1的初始位置
int posI = (n + 1) / 2;
int posJ = (n + 1) / 2;
a[posI, posJ] = 1;
int k = 1,f=0;//k表示从1开始到n*n,f计数
while (k<=n*n)
{
//向右1 3 5 7
for (i = 1; i <= 2 * f + 1; i++)
a[posI, ++posJ] = ++k;
//向下1 3 5 7
for (i = 1; i <= 2 * f + 1; i++)
a[++posI, posJ] = ++k;
//向左2 4 6 8
for (i = 1; i <= 2 *(f+1) ; i++)
a[posI, --posJ] = ++k;
//向上2 4 6 8
for (i = 1; i <= 2 *(f + 1); i++)
a[--posI, posJ] = ++k;
f++;
}
Console.WriteLine("得到的图形为:");
for (i = 0; i <n + 2; i++)
s[0, i] = "*";
for (i = 1; i <= n; i++)
{
s[i, 0] = "*";
for (j = 1; j <= n; j++)
{
s[i, j] = a[i, j].ToString();
}
s[i , n+1] = "*";
}
for (i = 0; i < n + 2; i++)
s[n+1, i] = "*";
for (i = 0; i < n + 2; i++)
{
for (j = 0; j <n + 2; j++)
{
Console.Write("{0,-8}",s[i,j]);
}
Console.WriteLine();
}
}
}
}
}
复制代码
作者:
贾俊锋
时间:
2014-5-9 21:40
好难的说,完全不懂,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2