各位大侠帮帮忙,看看错误在哪里

一个典型的struts2 + tiles + hibernate3 + mysql的小项目,这个问题查了半天没找到错误根源,更别提修改了……

 

HTTP Status 500 -


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.


Apache Tomcat/6.0.29

圆排列

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);
    }
}

暂时记录下……


HDU 题目分类

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  图论

 

hdu 2564词组缩写

刚开始用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皇后问题(位运算)

关于N皇后问题高效试探回溯算法的分析 

// 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来说仍能较大地提升效率!

1026 优先队列+dfs(诸多不懂)

#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;
}




Host by is-Programmer.com | Power by Chito 1.3.3 beta
Butterfly Theme | Design: HRS Hersteller of mobile Hundeschule.