算法竞赛入门经典: 第三章 数组和字符串 3.3蛇形填数
2015-08-11 10:49
417 查看
/* 蛇形填数: 在n*n方阵里填入1,2,...,n*n。要求填成蛇形。例如n=4时方阵为: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 上面的方阵中,多余的空格只是为了便于观察规律,不必严格输出。n<=8 00 01 02 0,n-1 10 11 12 1,n-1 ................ n-2,0 n-2,1 n-2,2 n-2,n-1 n-1,0 n-1,1 n-1,2 n-1,n-1 */ /* 关键: 1 本质是 iMatrix[++x][y],iMatrix[x][++y],iMatrix[x][--y],iMatrix[--x][y]的变化,用标记数组和迷宫界限来过滤搜索条件 2 while( x+1 < n && !iMatrix[x+1][y])//从上向下,横坐标不能越界,并且不能被访问过,索性把一排全部处理结束再做下一排 3 memset(iMatrix,0,sizeof(iMatrix));//需要对二维数组重新赋值 4 printf("%3d ",iMatrix[i][k]);//防止不美观,用printf("%3d ",iMatrix[i][k]) */ #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXSIZE 50 /* void snakeNum(int n) { int iMatrix[MAXSIZE][MAXSIZE]; int iDown,iLeft,iRight,iUp; for(int i = 1 ; i <= n*n ; i++) { //先向下 for(iDown = 0; iDown <= n-2 ;iDown++)//初始值和迭代区间是动态变化的 { iMatrix[iDown][n-1] = i;//列在动态变化 } //再向左 if(iDown >= n-1) { for(iLeft = n-1; iLeft >= 1; iLeft--)//最后一排 { iMatrix[n-1][iLeft] = i; } } //再向上 if(iLeft >=0 ) { for(iUp = n-1;iUp >= 1 ; iUp--) { iMatrix[iUp][0] = i; } } //再向右 if(iUp >= 0) { for(iRight = 0 ; iRight <= n - 2 ; iRight++) { iMatrix[0][iRight] = i; } } } } */ void snakeNum(int n) { int iMatrix[MAXSIZE][MAXSIZE]; memset(iMatrix,0,sizeof(iMatrix));//需要对二维数组重新赋值 int iVal = 1; int y = n-1,x = 0; iMatrix[x][y] = iVal; while(iVal < n*n)//=号不能取,否则陷入死循环中 { //从上向下,横坐标不能越界,并且不能被访问过,索性把一排全部处理结束再做下一排 //while( x+1 < n - 1 && iMatrix[x+1][y] != 0) while( x+1 < n && !iMatrix[x+1][y]) { iMatrix[++x][y] = ++iVal; } //从右向左,纵坐标不能越界,并且不能被访问过 //while( y-1 > 0 && iMatrix[x][y-1] != 0) while( y-1 >= 0 && !iMatrix[x][y-1]) { iMatrix[x][--y] = ++iVal; } //从下向上,横坐标不能越界 //while( x-1 > 0 && iMatrix[x-1][y] != 0) while( x-1 >= 0 && !iMatrix[x-1][y]) { iMatrix[--x][y] = ++iVal; } //从左向右,纵坐标不能超过n //while( y+1 < n-1 && iMatrix[x][y+1] !=0 ) while( y+1 < n && !iMatrix[x][y+1]) { iMatrix[x][++y] = ++iVal; } } for(int i = 0 ; i < n ; i++ ) { for(int k = 0 ; k < n ; k++) { printf("%3d ",iMatrix[i][k]);//防止不美观,用printf("%3d ",iMatrix[i][k]) } printf("\n"); } } int main(int argc,char* argv[]) { int n; scanf("%d",&n); snakeNum(n); system("pause"); return 0; }
相关文章推荐
- 21-IO流-14-IO流(字符流-缓冲区-BufferedReader-readLine方法原理)
- Oracle 12C -- Invisible Columns
- Error: L6218E: Undefined symbol main (referred from entry9a.o).
- Algorithms-94.Binary Tree Inorder Traversal
- ACM Computer Factory
- 21-IO流-13-IO流(字符流-缓冲区-BufferedReader)
- php5.4和apache2.4.9不在同一台服务器的配置注意事项
- OR1200数据Cache运用情景分析
- php webservice soap
- ACM Computer Factory
- ACM Computer Factory
- HDU 1269 迷宫城堡
- 神奇的口袋(百练2755) ( DFS + DP )
- 图片
- apache 日志切割
- myeclipse ctrl +D 删除当前行失效解决方法
- windows 2012 R2 DHCP FailOver
- Win10 Mobile预览版10152推送具体时间是什么时候?
- 红黑树
- Linux C基于Socket的多线程扫描程序