一个典型的struts2 + tiles + hibernate3 + mysql的小项目,这个问题查了半天没找到错误根源,更别提修改了……
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.tiles.TilesException org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:614) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:246) org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105) org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266) com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
root cause
java.lang.NullPointerException org.apache.struts2.tiles.StrutsTilesRequestContext.dispatch(StrutsTilesRequestContext.java:84) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:606) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:246) org.apache.struts2.views.tiles.TilesResult.doExecute(TilesResult.java:105) org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:362) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:266) com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.29 logs.
http://10.131.10.118/JudgeOnline/showproblem?problem_id=1088
相信排列大家很熟悉,从3个对象a,b,c中取3个的排列分别abc, acb, bac, bca, cab 和 cba 6个不同的方式 .我们将从n个不同对象中取r个的排列个数计为P(n,r)。而圆排列与排列的不同之处在于圆周排列头尾相邻,比如上例中abc, bca, cab 就属于同一个圆周排列。我们定义从n个互不相同的对象中取r的圆排列数计为Q(n,r).已知n,r请你计算Q(n,r).
input
输入有多组case,每个case一行, 是两个已空格隔开的整数n和r( 0 <= r <= n ),且大小不超过30。
output
每个case输出一个整数,为Q(n,r).
sample input 3 3
sample output 2
分析:
从n个不同元素中不重复地取出m(1≤m≤n)个元素在一个圆周上,叫做这n个不同元素的圆排列。如果一个 m-圆排列旋转可以得到另一个m-圆排列,则认为这两个圆排列相同。n个不同元素的m-圆排列数为n!/[m*(n-m)! 当 m==0 || n ==0 时, 排列数为1.
特别地,当m=n 时,n个不同元素作成的圆排列总数为(n-1)!。
#include<stdio.h>
void main()
{
int n, m, i;
double zi, mu, s;
while( scanf("%d %d", &n, &m) != EOF ){
if( m == 0 || n == 0 ) s = 1;
else {
for( i = 1, zi = 1; i <= n; i++ )
zi *= i;
for( i = 1, mu = m; i <= n-m; i++ )
mu *= i;
s = zi/mu;
}
printf("%.0lf\n", s);
}
}
1001 这个就不用说了吧
1002 简单的大数
1003 DP经典问题,最大连续子段和
1004 简单题
1005 找规律(循环点)
1006 感觉有点BT的题,我到现在还没过
1007 经典问题,最近点对问题,用分治
1008 简单题
1009 贪心
1010 搜索题,剪枝很关键
1011
1012 简单题
1013 简单题(有个小陷阱)
1014 简单题
1015 可以看作搜索题吧
1016 经典的搜索
1017 简单数学题
1018 简单数学题
1019 简单数学题
1020 简单的字符串处理
1021 找规律的数学题
1022 数据结构的题(栈的应用)
1023 特殊的数(Catalan Number)
1024 经典DP,最大M子段和
1025 经典DP,最长递增子序列(要用NLogN的方法过)
1026 搜索
1027 数学题(或用STL)
1028 经典问题,整数拆分,用母函数做
1029 简单题(一般方法容易超时)
1030 简单题,可用模拟过
1031 简单题
1032 简单题
1033 模拟题
1034 Candy Sharing Game
1035 模拟题
1036 简单题
1037 简单题,不是一般的简单
1038 简单题
1039 字符串处理
1040 简单题,排序
1041 简单题,用大数
1042 大数
1043 经典搜索题,八数码问题
1044 稍微有点麻烦的搜索题
1045 搜索题,可用匹配做
1046 简单题
1047 简单的大数
1048 简单字符串处理
1049 简单题
1050 贪心
1051 经典贪心,也可以用DP
1052 贪心
1053 贪心,关于Huffman编码
1054 二分匹配
1055 二分匹配
1056 简单题
1057 模拟题
1058 经典问题,丑数,DP
1059 经典问题,可以用母函数或DP(不针对题目优化都会超时)
1060 数学题
1061 数学题
1062 简单字符串处理
1063 模拟大数
1064 简单题
1065 简单题
1066 数学题,找规律
1067
1068 经典二分匹配
1069 经典DP
1070 简单题
1071 简单数学题
1072 搜索
1073 字符串处理
1074 DP
1075 字典树
1076 简单题
1077
1078 DP
1079 博弈(DP)
1080 DP
1081 经典DP
1082 简单题
1083 二分匹配
1084 简单题
1085 母函数
1086 简单几何题
1087 简单DP
1088 字符串处理
1089~1096 (练习输入输出的8个题目)
1097 简单数学题
1098 数学题,注意找规律
1099 数学题
模拟题, 枚举
1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 1049 1050 1057 1062 1063 1064 1070 1073 1075 1082 1083 1084 1088 1106 1107 1113 1117 1119 1128 1129 1144 1148 1157 1161 1170 1172 1177 1197 1200 1201 1202 1205 1209 1212(大数取模) 1216(链表)1218 1219 1225 1228 1229 1230 1234 1235 1236 1237 1239 1250
1256 1259 1262 1263 1265 1266 1276 1279 1282 1283 1287 1296 1302 1303 1304 1305 1306 1309 1311 1314
复杂模 拟
搜索,递归求解
1010 1016 1026 1043(双广) 1044 (BFS+DFS) 1045 1067 1072 1104 1175 1180 1195 1208 1226 1238 1240 1241 1242 1258 1271 1312 1317
博奕
1079
动态规划
1003 1024 1025 1028 1051 1058 1059 1069 1074 1078 1080 1081 1085 1087 1114 1158 1159 1160 1171 1176 1181 1203 1224 1227 1231 1244 1248 1253 1254 1283 1300
数学,递推,规律
1005 1006 1012 1014 1018 1019 1021 1023 1027 1030 1032 1038 1041 1046 1059 1060 1061 1065 1066 1071(微积分) 1097 1098 1099 1100 1108 1110 1112 1124 1130 1131 1132 1134 1141 1143 1152 1155(物理题) 1163 1165 1178 1194 1196(lowbit) 1210 1214 1200 1221 1223 1249 1261 1267 1273 1290 1291 1292 1294 1297 1313 1316
数论
1164 1211 1215 1222 1286 1299
计算几何
1086 1115 1147
贪心
1009 1052 1055 1257
并查集
1198 1213 1232 1272
线段树,离散化
1199 1255
图论
最短路相关的问 题 1142 1162 1217 1301
二分图问题 1054 1068 1150 1151 1281
其他
1053 (huffman) 1102(MST) 1116(欧拉回路) 1233(MST) 1269(强连通)
数据结构
1103(堆+模 拟)1166(数状树组)1247 1251 1285(Topol) 1298
汉诺塔系列
1207
最近顶点对 1007
1500 DP
1501 DP
1502 DP or 记忆化
1503 DP
1504 模拟
1505 DP
1506 DP
1507 2分匹配
1508 记忆化容易点
1509 模拟
1510 DP
1511 搜索可以过
1512 左偏树
1513 DP
1514 DP
1515 DFS
1516 DP
1517 博奕
1518 搜索
1519 DP(不确定)
1520 树状DP
1521 数学题,母函数什么的。其实都可以过
1522 稳定婚姻
1523 DP
1524 博弈
1525 博弈
1526 Maxflow
1527 博弈
1528 2分匹配
1529 简单题
1530 最大团
1531 差分约束
1532 Maxflow 入门题
1533 KM Or 最小费用流
1534 差分约束
1535 差分约束
1536 博弈
1537 模拟 加置换群的理论 CODE可以短些,其实没必要。。。
1538 很有意思的题目。据说是Microsoft亚洲总裁面试的题目
1539 搜索
1540 线段树
1541 树状数组
1542 离散,线段树
1543 线段树
1544 简单的
1545 DP http://acm.hdu.edu.cn/forum/htm_data/18/0608/2050.html
1546 搜索
1547 模拟
1548 模拟
1551 2分答案
1553
1554
1555 简单
1556 技巧。数学
1557 搜索
1558 并查 + 线段判交
1559 DP
1560 减支 + 搜索
1561 树状DP
1562 暴力 between 1000 and 9999
1563 简单
1564 博弈。
1565 状态DP
1566 数学
1567 模拟
1568 大数
1569 最小割
1570 数学
1571 最段路
1572 搜索
1573 数学
1574 DP
1575 2分
1576 数论
1577 模拟,处理精度
1579 记忆化
1580 DP
1582 搜索
1583 模拟
1584 搜索
1585
1586
1587 简单题目
1591 模拟
1592 简单
1593 数学
1594 数学
1595 图论
1596 图论
1597 图论
1598 图论
1599 图论
刚开始用string来输入,发现不对,string 必须输入两个'\n', 或连续输入两个字符串,才能输出第一个字符串……还有输入需要放进while(1)内
#include<iostream>
#include<string>
using namespace std;
int isupper( char c){
if ( c >= 'A' && c <= 'Z' ) return 1;
return 0;
}
int main()
{
int t;
scanf("%d%*c",&t);
while(t--)
{
char qian,hou;
while( 1 ) {
qian = getchar();
if( qian != ' ' ) {
if( isupper(qian) ) putchar( qian );
else putchar(qian-32);
break;
}
}
while( 1 ) {
hou = getchar();
if( hou == 10 ) break;
if( qian == ' ' && hou != ' ' ) {
if( isupper(hou) ) putchar(hou);
else putchar( hou - 32 );
}
qian = hou;
}
putchar(10);
}
return 0;
}
// N Queens Problem
// 试探-回溯算法,递归实现
// sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
long sum = 0, upperlim = 1;
// 试探算法从最右边的列开始。
void test(long row, long ld, long rd) 。
{
if (row != upperlim)
{
// row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,
// 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1。
// 也就是求取当前哪些列可以放置皇后。
long pos = upperlim & ~(row | ld | rd);
while (pos) // 0 -- 皇后没有地方可放,回溯。
{
// 拷贝pos最右边为1的bit,其余bit置0。
// 也就是取得可以放皇后的最右边的列。
long p = pos & -pos;
// 将pos最右边为1的bit清零。
// 也就是为获取下一次的最右可用列使用做准备,
// 程序将来会回溯到这个位置继续试探。
pos -= p;
// row + p,将当前列置1,表示记录这次皇后放置的列。
// (ld + p) << 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
// (ld + p) >> 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
// 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
// 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
// 在每次选择列之前进行,原来N×N网格中某个已放置的皇后针对其对角线
// 上产生的限制都被记录下来了。
test(row + p, (ld + p) << 1, (rd + p) >> 1);
}
}
else
{
// row的所有位都为1,即找到了一个成功的布局,回溯。
sum++;
}
}
int main(int argc, char *argv[])
{
time_t tm;
int n = 16;
if (argc != 1)
n = atoi(argv[1]);
tm = time(0);
// 因为整型数的限制,最大只能32位,
// 如果想处理N大于32的皇后问题,需要
// 用bitset数据结构进行存储。
if ((n < 1) || (n > 32))
{
printf(" 只能计算1-32之间\n");
exit(-1);
}
printf("%d 皇后\n", n);
// N个皇后只需N位存储,N列中某列有皇后则对应bit置1。
upperlim = (upperlim << n) - 1;
test(0, 0, 0);
printf("共有%ld种排列, 计算时间%d秒 \n", sum, (int) (time(0) - tm));
}
上述代码容易看懂,但我觉得核心的是在针对试探-回溯算法所用的数据结构的设计上。
程序采用了递归,也就是借用了编译系统提供的自动回溯功 能。
算法的核心:使用bit数组来代替以前由int或者bool数组来存储当前格子被占用或者说可用信息,从这
可以看出N个皇后对应需要N位表示。
巧妙之处在于:以前我们需要在一个N*N正方形的网格中挪动皇后来进行试探回溯,每走一步都要观察
和记录一个格子前后左右对角线上格子的信息;采用bit位进行信息存储的话,就可以只在一行格子也
就是(1行×N列)个格子中进行试探回溯即可,对角线上的限制被化归为列上的限制。
程序中主要需要下面三个bit数组,每位对应网格的一 列,在C中就是取一个整形数的某部分连续位即可
。
row用来记录当前哪些列上的位置不可用,也就是哪些列被皇后占用,对应为1。
ld,rd同样也是记录当前哪些列位置不可用,但 是不表示被皇后占用,而是表示会被已有皇后在对角线
上吃掉的位置。这三个位数组进行“或”操作后就是表示当前还有哪些位置可以放置新的皇后,对应0
的位置可放新的皇后。如下图所示的8皇后问题求解得第一步:
row: [ ][ ][ ][ ][ ][ ][ ][*]
ld: [ ][ ][ ][ ][ ][ ][*][ ]
rd: [ ][ ][ ][ ][ ][ ][ ][ ]
--------------------------------------
row|ld|rd: [ ][ ][ ][ ][ ][ ][*][*]
所有下一个位置的试探过程都是通过位操作来实现的,这是借用了C语言的好处, 详见代码注释。
关于此算法,如果考虑N×N棋盘的对称性,对于大N来说仍能较大地提升效率!
#include<iostream>
#include<queue>
using namespace std;
struct node {
int x,y;
int time;
bool operator< (const node t) const {
return time>t.time;
}
};
struct cmap {
int nx,ny;
char c;
}map[101][101];
int n,m;
int fight[101][101], mark[101][101];
priority_queue<node> que;
int bfs() {
int k;
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
node now,next;
while(!que.empty())
que.pop();
now.x=n-1;now.y=m-1;
if(map[now.x][now.y].c>='1' && map[now.x][now.y].c<='9') {
now.time=map[n-1][m-1].c-'0';
fight[now.x][now.y]=map[now.x][now.y].c-'0';
}
else
now.time=0;
que.push(now);
while(!que.empty()) {
now=que.top();
que.pop();
if(now.x==0 && now.y==0)
return now.time;
for(k=0;k<4;k++) {
next.x=now.x+dir[k][0];
next.y=now.y+dir[k][1];
if(next.x>=0 && next.x<n && next.y>=0 && next.y<m && !mark[next.x][next.y] && map[next.x][next.y].c!='X') {
if(map[next.x][next.y].c>='1' && map[next.x][next.y].c<='9') {
fight[next.x][next.y]=map[next.x][next.y].c-'0';
next.time=now.time+map[next.x][next.y].c-'0'+1;
}
else
next.time=now.time+1;
que.push(next);
map[next.x][next.y].nx=now.x;
map[next.x][next.y].ny=now.y;
mark[next.x][next.y]=1;
}
}
}
return -1;
}
int main()
{
int i,j,flag,x,y,tx,ty,sec;
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF) {
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
scanf(" %c",&map[i][j].c);
mark[i][j]=fight[i][j]=0;
}
}
mark[n-1][m-1]=1;
flag=bfs();
if(flag!=-1){
printf("It takes %d seconds to reach the target position, let me show you the way.\n",flag);
sec=1;x=y=0;
while(sec!=flag+1) {
printf("%ds:(%d,%d)->(%d,%d)\n",sec++,x,y,map[x][y].nx,map[x][y].ny);
for(i=1;i<=fight[map[x][y].nx][map[x][y].ny];i++)
printf("%ds:FIGHT AT (%d,%d)\n",sec++,map[x][y].nx,map[x][y].ny);
tx=map[x][y].nx;ty=map[x][y].ny;
x=tx;y=ty;
}
}
else
printf("God please help our poor hero.\n");
printf("FINISH\n");
}
return 0;
}