【UVa】[227]Puzzle
2016-01-10 21:42
405 查看
第一印象就是题目好长啊……
据说是ACM/ICPC World Finals 1993的一道题……
感觉屌屌的~
所以……
先把前几天写的对这一题的思路全部打上为敬……
用二维字符串数组储存网格(第n行整体为一字符串)
用字符串记录指令语句,用循环来进行判断
读取到A、B、L、R执行对应命令
其它字符 break; 并输出“This puzzle has no final configuration.”
输入可用两重循环并使用 x,y 来记录空格所在
(网格中空格处记录为 0)
(第二重循环结束用getchar()吸收空行)
A:上 B:下 L:左 R:右 (A:把上方的字母移入空格)
示例代码:
[code]// ARRBBL 其对应变化为 // A: map(x,y)=map(x,y-1); map(x,y-1)=0; y=y-1; // B: map(x,y)=map(x,y+1); map(x,y+1)=0; y=y+1; // L: map(x,y)=map(x-1,y); map(x-1,y)=0; x=x-1; // R: map(x,y)=map(x+1,y); map(x+1,y)=0; x=x+1;
变换后输出结果 (应该可以用一重循环搭配 printf)
printf("%s\n",map[y]);
/* 需要测试 */最直接的还是用两重循环搭配putchar()
(第二重循环结束输出”\n”)
当时就是这样想的
然后今天来正式的写~
首先做二维数组相关的测试
事实证明
[code]char map[5][5]; for(int i=0; i<5; i++) scanf("%s",map[i]);
此种写法会把字符存在
map[0][1-5] 这里面
同理可用于 printf
不可以这么打印啊……
具体见:【看书】二维字符数组
所以输入网格的时候不一定要用getchar()
但这里因为涉及到网格中空格的判定
所以还是用 两重循环搭配 getchar() 比较好
久经尝试
虽然改了各种坑点还是WA了……
是在下小看这一题了
先打个flag
WA代码:
[code]#include<stdio.h> #include<string.h> int main() { int x,y; int k,kase=0; char s[1000]; char map[5][5]; while(scanf("%c",&map[0][0]),map[0][0]!='Z') { for(int i=0; i<5; i++) { int flag=1; for(int j=0; j<5; j++) { if(i||j) { map[i][j]=getchar(); if(map[i][j]==' ') { y=i; x=j; } else if(map[i][j]=='\n') { map[i][j]=' '; y=i; x=j; flag=0; } } else continue; } if(flag) getchar(); } int t=-1; memset(s,0,sizeof(s)); while((s[++t]=getchar())!='0'); if(kase) printf("\n"); printf("Puzzle #%d:\n",++kase); for(k=0; k<t; k++) { if(s[k]=='A') { if(y-1<0) { printf("This puzzle has no final configuration.\n"); break; } else { map[y][x]=map[y-1][x]; map[y-1][x]=0; y=y-1; } } else if(s[k]=='B') { if(y+1>=5) { printf("This puzzle has no final configuration.\n"); break; } else { map[y][x]=map[y+1][x]; map[y+1][x]=0; y=y+1; } } else if(s[k]=='L') { if(x-1<0) { printf("This puzzle has no final configuration.\n"); break; } else { map[y][x]=map[y][x-1]; map[y][x-1]=0; x=x-1; } } else if(s[k]=='R') { if(x+1>=5) { printf("This puzzle has no final configuration.\n"); break; } else { map[y][x]=map[y][x+1]; map[y][x+1]=0; x=x+1; } } else if(s[k]=='\n') { continue; } else { printf("This puzzle has no final configuration.\n"); break; } } if(k==t) { for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { putchar(map[i][j]); if(j!=4) putchar(' '); } printf("\n"); } } memset(map,0,sizeof(map)); char ch; while((ch = getchar()) != '\n' && ch != EOF); } return 0; }
题目地址:【UVa】[227]Puzzle
相关文章推荐
- C#中HttpWebRequest用Post提交Content-Type: multipart/form-data;
- OpenGL系统设计——求帧速度
- 创建带子菜单的选项菜单
- Mybatis深入之事务管理
- 非线性思维 -- 大前研一
- 等待队列 赏析
- Go 四篇
- [leetcode oj 191]Number of 1 Bits
- HPU:1232畅通工程(并查集)
- SSH框架
- 基础编程模型(译自 Algorithms Fourth Edition)
- 5.3.5 namedtuple() 创建命名字段的元组结构
- 292. Nim Game
- 未来十年,Blockchain 会如何重塑互联网世界?
- 简易在线投票系统(php)——发布投票页面
- 5.3.5 namedtuple() 创建命名字段的元组结构
- Lingo
- cocos2d-x一个函数实现精灵变灰效果
- 【Java】Java数据结构和算法(二)——栈和队列
- 命题逻辑及其形式化系统的局限